SpringBoot深入浅出刨析底层自动装配原理

SpringBoot深入浅出刨析底层自动装配原理

在大部分的情况下,Spring Boot允许通过配置文件自动装配Bean。那是因为它依赖spring-boot-starter-web包,于是会引入spring-boot-starters包,进而引入spring-boot-autoconfigure包。这个包会提供自动配置的功能,有关自动配置的类很多

​ a)SpringBoot启动的时候加载主配置类,利用 @EnableAutoConfiguration注解开启了自动配置功能

​ b)利用EnableAutoConfigurationImportSelector给容器中导入一些组件,将类路径下 META-INF/spring.factories 里面配置的所有EnableAutoConfiguration的值加入到了容器中(下面代码为部分自动配置类),每一个这样的 xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中,用它们来做自动配置。

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\
org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\
org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\

​ c)HttpEncodingAutoConfiguration(Http编码自动配置) 为例解释自动配置原理,如下代码:

/*
注解作用:
	@Configuration:加在某个类上表示这个类属于配置类(和Spring的bean配置管理的XML文件功能一样)
	
	@EnableConfigurationProperties:表示HttpEncodingProperties类可以通过配置文件进行装配(可在application.properties文件中配置它)
	
	@ConditionalOnWebApplication:判断当前应用是否是web应用,如果是,当前配置类生效
	
	@ConditionalOnClass:判断当前项目有没有这个类CharacterEncodingFilter(SpringMVC中进行乱码解决的过滤器),存在CharacterEncodingFilter这个类后,Spring IoC容器才去装配HttpEncodingAutoConfiguration这个类
	
	@ConditionalOnProperty:这是一个检测属性配置的注解,代码中的配置也就是当存在属性spring.http.encoding.*配置后,才会启动这个类作为配置文件(即使不存在,判断也是成立的)
	
	@ConditionalOnMissingBean:说明在Spring IoC容器不存在CharacterEncodingFilter类型的Bean的时候才会使用这个方法装配Bean
	*/
@Configuration
@EnableConfigurationProperties(HttpEncodingProperties.class)
@ConditionalOnWebApplication//判断当前应用是否是web应用,如果是,当前配置类生效
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {
    
    

	private final HttpEncodingProperties properties;

	public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {
    
    
		this.properties = properties;
	}

	@Bean//给容器中添加一个组件,这个组件的某些值需要从properties中获取
	@ConditionalOnMissingBean(CharacterEncodingFilter.class)
	public CharacterEncodingFilter characterEncodingFilter() {
    
    
		CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
		filter.setEncoding(this.properties.getCharset().name());
		filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
		filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
		return filter;
	}

​ d)查看RedisRepositoriesAutoConfiguration自动配置源码如下:

/*
	注解作用:
		@Import:表示加载其他的类到当前的环境中来。
		@AutoConfigureAfter:表示在完成RedisAutoConfiguration的装配后才执行,因为有些类存在先后的逻辑关系。
	补充:@AutoConfigureBefore来定制在哪些类之前初始化,这样就可以定制Spring IoC容器装配Bean的先后顺序
	*/
@Configuration
@ConditionalOnClass({
    
     Jedis.class, EnableRedisRepositories.class })
@ConditionalOnProperty(prefix = "spring.data.redis.repositories", name = "enabled", havingValue = "true", matchIfMissing = true)
@ConditionalOnMissingBean(RedisRepositoryFactoryBean.class)
@Import(RedisRepositoriesAutoConfigureRegistrar.class)
@AutoConfigureAfter(RedisAutoConfiguration.class)
public class RedisRepositoriesAutoConfiguration {
    
    

}

​ 通过以上两个例子分析,对Spring Boot的自动生成机制有了初步了解,为了以后更好地使用SpringBooot开发,来确定Spring Boot会自动装配什么,如果需要自定义修改,需要做什么,从而让Spring Boot更好地服务于开发实践

猜你喜欢

转载自blog.csdn.net/weixin_45496190/article/details/107288240