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 xxxAutoConfiguration
componentes é 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