Spring注解驱动开发(一) 组件扫描,注册与过滤
配置类
使用配置类(java代码)替代了原有的 XML (XML文件)配置方式,简化书写
使用@Configuration
注解,IOC容器类型选择为 AnnotationConfigApplicationContext
,例如
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(MyConfig.class);
包扫描
@ComponentScan(value={"com.xx"....},includeFilters=@Filter(Filter实现类),excludeFilters=....)
@ComponentScans({@ComponentScan....})
注意useDefaultFilters=false
,使用自己的Filter的时候,需要把默认的过滤去掉
作用域
@Scope( value )
value可取下面的值
- singleton: 单实例,默认
- prototype: 多实例
- request: 同请求一个实例
- session: 同session 一个实例
懒加载
@Lazy
只针对单实例 Bean,因为原型模式不使用是不会去加载的。
条件导入
@Conditional(Conditional)
可以自己定义类实现 Conditional接口并实现 matches()方法。
public class LinuxCondition implements Condition{
public boolean matches(ConditionContext context,AnnotatedTypeMetadata metadata){
//...
return true;
}
}
//其中的 ConditionContext 可以获取很多信息
context.getBeanFactory(); //BeanFactory
context.getClassLoader(); //ClassLoader
context.getEnvironment(); //Environment
context.getRegistry(); //BeanDefinitionRegistry
向IOC中导入组件的其他方法
给容器中注入组件就有几种方式
- 包扫描+组件注解(
@Controller
,@Servcie
,@Component
,@Repository
)。这种方式不能导入第三方包的组件 @Bean
,可以导入第三方包的组件@Import
,这个注解有几种使用方式
-@Import(要导入的组件)
,id是全类名
-@Import(ImportSelector)
,ImportSelector是一个接口,实现String[] selectImports
接口,返回值为全类名,id也为全类名
-@Import(ImportBeanDefinitionRegister)
,实现ImportBeanDefinitionRegister中的RegiserBeanDefinitions()
,手工注册FactoryBean
,工厂Bean。将FactoryBean导入容器中后,通过FactoryBean的id获取具体的Bean,而实际的FactoryBean要通过&+FactoryBeanId
获取
任何脱离整体的细节都是耍流氓