Spring boot自动装配原理探究
springboot项目启动时,会自动帮我们加载许多的配置类,这个过程是怎么实现的呢?其实是主启动类上的注解@SpringBootApplication帮我们做的
光标移动到主启动类上方的注解SpringbootApplication,发现这是个复合注解
点进去后再点击@EnableAutoConfiguration
其中@Import({AutoConfigurationImportSelector.class})是核心注解,点进去这个类,里面有个获取候选配置的方法,点进去看
再点击SpringFactoriesLoader这个类
最终我们发现是通过SpringFactoriesLoader.loadFactoryNames()扫描所有具有META-INF/spring.factories的jar包。
也就是说,所有META-INF 目录下有spring.factories的jar包下的类在启动时就被自动装配了
这些AutoConfiguration结尾的类都被自动装配了
不过,并不是自动装配了的类就能生效,我们接着往下看
随便找个xxxAutoconfiguration类看看,这里我们选了DataSourceTransactionManagerAutoConfiguration这个类
这里的@Configuration注解表明该类是一个配置类,后面如果我们要扩展这个类的功能,也需要给自定义的类加上这个注解,我们定义的类就会出现在List getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes)里面的候选类中。
看到@ConditionalOnClass({JdbcTemplate.class, TransactionManager.class})这句,意思是必须要系统有JdbcTemplate.class和TransactionManager.class这两个类存在,这个配置类的所有组件才能生效,否则即便这个自动配置类被装配了也无法生效。
现在我们看最下面的注解@EnableConfigurationProperties({DataSourceProperties.class}),这个注解也是最重要的一个,“约定大于配置”在这里得到很好的体现。点进去这个DataSourceProperties.class
我们发现这个类中包含了很多属性,下面还有很多这些属性的set()和get()方法,我没截出来
这个唯一的注解@ConfigurationProperties是负责把当前这个类和application.yml/properties配置文件绑定起来的,并把我们自定义的配置注入到这个类中去,也就是说,我们可以自行更改这些属性。
回到上面第二个图,注解@EnableConfigurationProperties({DataSourceProperties.class})的作用就是把{}里的这个类加载到IOC容器中,我们使用时只需自动注入就行了。