前言:一直对SpringBoot的自动注入感兴趣,特意查了一下并进行了实现.
参考:https://blog.csdn.net/zxc123e/article/details/80222967(绝大部分是照抄了此博文,某些地方进行了改动)
https://www.cnblogs.com/duanxz/p/4520571.html
https://blog.csdn.net/gottst0113/article/details/80978966
https://www.cnblogs.com/duanxz/p/7493276.html
目录
3.1.5 HelloAutoConfiguration.java
3.2.3 application.properties配置
第一章 实现自动装配的注解
首先Spring Boot项目中都会如下启动类:
@SpringBootApplication
public class TestAutoConfigApplication {
public static void main(String[] args) {
SpringApplication.run(TestAutoConfigApplication.class, args);
}
}
从上面代码可以看出,注解@SpringBootApplication
和SpringApplication.run()
方法是最为重要的部分。这里主要来看看@SpringBootApplication
注解部分。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
...
}
虽然定义使用了多个Annotation进行了原信息标注,但实际上重要的只有三个Annotation:
@Configuration(@SpringBootConfiguration点开查看发现里面还是应用了@Configuration,相当于把该类作为spring的xml配置文件中的<beans>
)
@EnableAutoConfiguration(实现自动装配的注解)
@ComponentScan(将标识了需要装配的类自动装配到spring的bean容器中)
如果在启动类使用这个三个注解,整个SpringBoot应用依然可以与之前的启动类功能一样。但每次写这3个比较啰嗦,所以写一个@SpringBootApplication方便点。
第二章 EnableAutoConfiguration讲解
既然我们要讲自动装配,是要把EnableAutoConfiguration说一下.
打开其源代码:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
//@Import注解是为了把某个类注入到IOC容器中,这样就可以进行自动装配啥的,也可以通过getBean获取.
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
...
}
可以看到其将AutoConfigurationImportSelector.class导入了容器,借助AutoConfigurationImportSelector
,@EnableAutoConfiguration
可以帮助SpringBoot应用将所有符合条件的@Configuration
配置都加载到当前SpringBoot创建并使用的IoC容器(注意是Configuration配置)。
打开AutoConfigurationImportSelector的源码,
可以看到通过 SpringFactoriesLoader.loadFactoryNames()
把 XXX.jar/META-INF/spring.factories中每一个xxxAutoConfiguration文件都加载到容器中.
protected List<String> getCandidat