Análise aprofundada do SpringBoot do princípio básico de montagem automática

Análise aprofundada do SpringBoot do princípio básico de montagem automática

Na maioria dos casos, o Spring Boot permite a montagem automática de Beans por meio de arquivos de configuração. Isso porque ele depende do pacote spring-boot-starter-web, então ele apresentará o pacote spring-boot-starters e, em seguida, o pacote spring-boot-autoconfigure. Este pacote irá fornecer a função de configuração automática, existem muitos tipos de configuração automática

A) Carregue a classe de configuração principal quando o SpringBoot iniciar, use @EnableAutoConfigurationA função de configuração automática está ligada

B) Use EnableAutoConfigurationImportSelector para importar alguns componentes para o contêiner e coloque o classpath sob META-INF / spring.factoriesEnableAutoConfiguration todos os valores adicionados à configuração dentro da embarcação (doravante, código de classe de configuração parcialmente automatizada), cada um desses xxxAutoConfigurationcomponentes é uma classe de contêiner, são adicionados à embarcação, eles são usados ​​para fazer a configuração automática.

# 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 (configuração automática de codificação Http) como exemplo para explicar o princípio da configuração automática, o seguinte código:

/*
注解作用:
	@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) Visualize o código-fonte da configuração automática de RedisRepositoriesAutoConfiguration da seguinte forma:

/*
	注解作用:
		@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 {
    
    

}

Através da análise dos dois exemplos acima, eu tenho uma compreensão preliminar do mecanismo de geração automática do Spring Boot. A fim de usar melhor o desenvolvimento do SpringBoot no futuro, para determinar o que o Spring Boot montará automaticamente, se você precisar personalizar a modificação, o que precisa ser feito, para que o Spring Boot atenda melhor à prática de desenvolvimento

Acho que você gosta

Origin blog.csdn.net/weixin_45496190/article/details/107288240
Recomendado
Clasificación