Spring Bean的作用域、条件注解和@Import方式注入
总结:注入Bean的几种形式
- xml形式配置
@ComponentScan
扫描器 + 三层注解@Configuration
+@Bean
@Import
的三种注入形式(直接注入、实现ImportSelector
、实现ImportBeanDefinitionRegistrar
)- 实现
FactoryBean
+@Bean
Bean的作用域
即Scope,常用的为singleton(单例)和prototype(原型、多实例)
- Scope默认为singleton(单例),可以通过
@Scope(value = "prototype")
修改为多实例 - 执行时机:singleton为容器初始化时,prototype为真正使用该Bean时
- singleton也支持延迟加载,需要加上
@Lazy
注解,在第一次使用时产生。
条件注解
通过JVM参数指定,在容器初始化时将满足条件的Bean加入容器
1. 条件类必须实现Condition
接口(spring.context)
2. 重写方法matches中获取环境,并根据环境值进行判断是否创建Bean
3. 创建bean,使用@Conditional注解进行条件判断
4. 在VM Options中设置car.type参数
5. 结果
@Conditional
获取JVM的参数进行判断后,产生出相应的Bean
@Import注入方式一
@Import
可以指定需要加入容器中的Bean,搭配@Configuration
使用
@Import注入方式二(通过实现ImportSelector)
实现ImportSelector
接口,重写其中的selectImports()
方法
@Import注入方式三
通过实现ImportBeanDefinitionRegistrar
,方法和方式2一样,具体实现如下:
@Import(BeanImportBeanDefinitionRegistrar.class)
FactoryBean方式注入
通过实现FactoryBean接口,可以构造一个能创建 某个类型Bean的工厂,实现如下:
AppleFactoryBean
BeanConfiguration
测试代码
注意
FactoryBean
是将Bean 和 Factory一起加入IOC容器的,在获取Bean时需要确定是 “工厂本身” 还是“工厂创建的Bean”
如上图,bean的名字前有&的就是工厂本身的bean,反之就是工厂创建出来的bean