EnableAutoConfiguration注解的工作原理
来源:互联网 发布:spss如何转换数据 编辑:程序博客网 时间:2024/05/16 05:49
demo
自己定义一个外部项目,core-bean,依赖如下,
<artifactId>core-bean</artifactId><packaging>jar</packaging><dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.9.RELEASE</version> </dependency></dependencies>
然后定义一个Cat类,
public class Cat {}
package core.bean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class MyConfig { @Bean public Cat cat(){ return new Cat(); }}
我们知道这样就将Cat类装配到Spring容器了。
再定义一个springboot项目,加入core-bean依赖,依赖如下:
<artifactId>springboot-enableAutoConfiguration</artifactId><packaging>jar</packaging><dependencies> <dependency> <groupId>com.zhihao.miao</groupId> <artifactId>core-bean</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency></dependencies>
启动类启动:
@EnableAutoConfiguration@ComponentScanpublic class Application { public static void main(String[] args) { ConfigurableApplicationContext context =SpringApplication.run(Application.class,args); Cat cat = context.getBean(Cat.class); System.out.println(cat); }}
发现Cat类并没有纳入到springboot-enableAutoConfiguration项目中。
解决方案,
在core-bean项目resource下新建文件夹META-INF,在文件夹下面新建spring.factories文件,文件中配置,key为自定配置类EnableAutoConfiguration的全路径,value是配置类的全路径org.springframework.boot.autoconfigure.EnableAutoConfiguration=core.bean.MyConfig
启动springboot-enableAutoConfiguration项目,打印结果:
原理分析
进入EnableAutoConfiguration注解源码,发现是导入EnableAutoConfigurationImportSelector类,
跟到最后发现继承了ImportSelector接口,之前我们讲过Springboot @Enable*注解的工作原理ImportSelector接口的selectImports返回的数组(类的全类名)都会被纳入到spring容器中。其在AutoConfigurationImportSelector类中的selectImports实现,进入org.springframework.boot.autoconfigure.AutoConfigurationImportSelector类,
进入getCandidateConfigurations方法
getCandidateConfigurations会到classpath下的读取META-INF/spring.factories文件的配置,并返回一个字符串数组。
调试的时候读取到了core.bean.MyConfig,也读到了一些其他的配置,下面会讲。
具体的就不细说了,有兴趣的朋友可以自己调试一下。
META-INF/spring.factories还可以配置多个配置类。比如我们在core-bean下在定义二个类,
package core.bean;public class Dog {}
package core.bean;public class People {}
package core.bean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class Myconfig2 { @Bean public Dog dog(){ return new Dog(); }}
修改META-INF/spring.factories下的配置,
org.springframework.boot.autoconfigure.EnableAutoConfiguration=core.bean.MyConfig,core.bean.Myconfig2,core.bean.People
修改springboot-enableAutoConfiguration项目的启动类:
package com.zhihao.miao;import core.bean.Cat;import core.bean.Dog;import core.bean.People;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;import org.springframework.context.ConfigurableApplicationContext;import org.springframework.context.annotation.ComponentScan;@EnableAutoConfiguration@ComponentScanpublic class Application { public static void main(String[] args) { ConfigurableApplicationContext context =SpringApplication.run(Application.class,args); Cat cat = context.getBean(Cat.class); System.out.println(cat); Dog dog = context.getBean(Dog.class); System.out.println(dog); People people = context.getBean(People.class); System.out.println(people); }}
打印结果如下:
发现都纳入到spring容器中了。
可以配置spring.boot.enableautoconfiguration=false禁用自动配置,这样不会启动自动配置了,默认是true。还可以排出一些自动配置类,可以在EnableAutoConfiguration注解加入参数,这边不做过多解释。
总结,@EnableAutoConfiguration 作用
从classpath中搜索所有META-INF/spring.factories配置文件然后,将其中org.springframework.boot.autoconfigure.EnableAutoConfiguration key对应的配置项加载到spring容器
只有spring.boot.enableautoconfiguration为true(默认为true)的时候,才启用自动配置
@EnableAutoConfiguration还可以进行排除,排除方式有2中,一是根据class来排除(exclude),二是根据class name(excludeName)来排除
其内部实现的关键点有
1)ImportSelector 该接口的方法的返回值都会被纳入到spring容器管理中
2)SpringFactoriesLoader 该类可以从classpath中搜索所有META-INF/spring.factories配置文件,并读取配置springboot内部如何使用@EnableAutoConfiguration注解
我们点进去spring-boot-autoconfigure中的META-INF下的spring.factories文件,发现spring.factories文件中配置了好多的配置类,在将这些依赖依赖到自己的项目中会将其都纳入到spring容器中,不过这些类好多都是配合@Conditional***等注解一起工作的。
举个例子:
在springboot-enableAutoConfiguration加入Gson依赖:<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId></dependency>
如果我们不在项目中配置,spring-boot-autoconfigure会自动帮我们装配一个对象实例名为gson的Gson实例。如果自己装配那么就使用自己装配的Gson实例。
启动测试类:
package com.zhihao.miao;import com.google.gson.Gson;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplicationpublic class Application { public static void main(String[] args) { ConfigurableApplicationContext context =SpringApplication.run(Application.class,args); System.out.println(context.getBeansOfType(Gson.class)); }}
此时自己没有去配置Gson对象,
如果自己配置了,测试代码如下,启动:
package com.zhihao.miao;import com.google.gson.Gson;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.ConfigurableApplicationContext;import org.springframework.context.annotation.Bean;@SpringBootApplicationpublic class Application { @Bean public Gson createGson(){ return new Gson(); } public static void main(String[] args) { ConfigurableApplicationContext context =SpringApplication.run(Application.class,args); System.out.println(context.getBeansOfType(Gson.class)); }}
- EnableAutoConfiguration注解的工作原理
- @EnableAutoConfiguration注解
- Spring Boot的@SpringBootApplication、@EnableAutoConfiguration、@ComponentScan注解
- @EnableAutoConfiguration和@SpringbootApplication注解
- Annotation注解的工作原理
- Java注解的工作原理
- @ResponseBody注解的工作原理
- SpringBoot @EnableAutoConfiguration原理
- java注解的实现和工作原理
- Java中注解的工作原理
- 第十三章 @Enable*注解的工作原理
- @EnableAutoConfiguration
- @EnableAutoConfiguration
- @Transactional注解工作原理
- 注解工作原理
- @EnableWebMvc 与 @EnableAutoConfiguration 的关系
- SpringBoot之@EnableAutoConfiguration原理及自定义扩展
- SpringBoot之@EnableAutoConfiguration原理及自定义扩展
- 【java】变量
- itext基础
- 服务器TIME_WAIT和CLOSE_WAIT详解和解决办法
- 字符串里解析vue表达式
- java并发编程学习(六) 重排序和顺序一致性
- EnableAutoConfiguration注解的工作原理
- python获取下周周一日期(获取指定周指定周几)
- 第七章:数据过滤
- 如何下载DWG矢量格式的CAD等高线
- 如何在VSCode中同步代码到github (on Mac)
- 20-常用对象API(集合框架练习) 21-常用对象API(集合框架-LinkedHashSet集合).
- 个人博客Blog搭建
- RabbitMQ消息队列(一): Detailed Introduction 详细介绍
- python之位置参数、关键值参数、参数收集