自动装配原理
使用方式
springboot组件中,starter组件都已经封装好了,ioc容器中已经有了,开箱即用
组件类型
spring官方的项目 spring-boot-starter-xxx 如web/test...
自定义提供的组件 xxx-spring-boot-starter 如mybatis,dubbo
思考
spring ioc容器中已有,
肯定是已经加载了该类,
要么是注入的类中直接使用了注解,ioc扫描到加载;要么就是使用了xml/configuration/import等注解间接加载进来。spring大概就这么几种加载方式
spring中使用import的方式,通过enable方式自动装配。
实现方式
1.@EnableAutoConfiguration
这个注解就声明在@SpringBootApplication中,这个注解就是把组件相关的Bean加载到ioc容器中2.进去发现@Import注解
@Import(AutoConfigurationImportSelector.class)
这个注解会加载一个配置类,解析配置加载需要的类;这个注解中需要指定配置类,配置类实现了ImportSelector接口,实现selectImports(),该方法返回一个数组,数组是需要被加载的类。
@AutoConfigurationPackage
这个注解是把使用了该注解的类所在的包及子包下所有组件扫描到ioc容器中
springboot中的实现
实现没有走AutoConfigurationImportSelector中的selectImports(),而是用到了springFactoriesLoader,springFactoriesLoader类似java中的spi,是spring内部约定俗成的加载方式,扫描classpath下的META-INF/spring.factories文件,其中是k-v配置,k就是EnableAutoConfiguration,v就是多个配置类,也就是需要自动装配的配置类
springfactoriesLoader配置文件如:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\.....\org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration
需要自动装配的配置类如:
RabbitAutoConfiguration,是一个基于javaConfig形式的配置类
@Configuration(proxyBeanMethods=false)
@ConfitionOnClass({RabbitTemplate.calss,Channel.calss})
@EnableConfigurationProperties(RabbitProperties.class)
@Import(RabbitAnnotationDrivenConfiguration.calss)
public class RabbitAutoConfiguration
用到了几个新注解
- ConditionOnClass
根据条件装配,这是@Conditional在springboot中的新注解,还有如@ConditionOnBean/OnMissingBean/OnProperty/OnResource...
意思在有这个bean时才加载,因为starter组件一般不是重复造轮子,而是再次封装已有的组件进行自动装配,所以如果没有加载成功需要的核心类,就没必要装载starter的配置类。 - @EnableConfigurationProperties
这个注解指定组件的配置文件,使用了java类配置,一般这个java类会使用@ConfigurationProperties,注解会把当前类下的属性和配置文件中的配置进行绑定(如application.properies),所以引用了组件,配置文件写在主配置文件中既可以读取、启动。
使用自动装配的组件
- 引入maven依赖
- 配置需要的属性
- 直接注入使用