Spring是如何导入Bean的
- Spring 1.x:使用
xml
- Spring 2.x:
xml
+@Component
(在xml中写<component-scan>) - Spring 3.x:去
xml
化,纯注解开发AnnotationConfigurableApplicationContext
使用纯注解开发:
必要的是一个@Configuration
配置类
@ComponentScan
+@Component
@Bean
,@BeanFactory
@Import(Bean.class)
@Import(? implements ImportSelector)
@Import(? implements ImportBeanDefinitionRegistrar)
- …
Spring Boot如何自动配置
需求:引入第三方jar包后,我们希望第三方jar包中的Bean,自动注入到我们的IoC容器中,我们几乎不需要做任何特殊处理,直接就可以使用IoC中的Bean了。
技术选型:
xml
:维护起来很烦,需要自己手动写xml注入,排除。@ComponentScan
:我们需要知道第三方的包名,并且手动输入到注解上,我们知道包名一般是这些公司的url倒序,所以包名是千奇百怪的,我们维护起来很麻烦,所以排除这个方案。@Bean
,@BeanFactory
:需要我们手动注入,排除。
剩余一个@Import
的方案,我们具体看下。
使用@Import
可以导入具体的类,特别是还可以配合ImportSelector
接口和ImportBeanDefinitionRegistrar
有策略的导入类。
其实ImportSelector
接口和ImportBeanDefinitionRegistrar
提供给了我们一个自动化导入的机会,因为这俩是接口,可以实现,然后在里面写扫描的逻辑,返回所有需要注入的类的全类名。
Spring Boot的自动配置方式,其实就是在一个ImportSelector
里面实现了一个扫描逻辑,并且在程序开始的时候就@Import
了这个ImportSelector
。
扫描逻辑是,扫描当前所有jar包中的META-INF/spring.factories
,里面存储的是key-value文本形式的数据,有很多需要导入的配置类Bean的全类名,这些配置类里面包括了需要自动导入的Bean。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.redisson.spring.cache.RedissonCacheStatisticsAutoConfiguration