基礎となる自動組立原理のSpringBootの詳細な分析

基礎となる自動組立原理のSpringBootの詳細な分析

ほとんどの場合、Spring Bootでは、構成ファイルを介したBeanの自動アセンブリが可能です。これは、spring-boot-starter-webパッケージに依存しているため、spring-boot-startersパッケージを導入し、次にspring-boot-autoconfigureパッケージを導入するためです。このパッケージは自動構成の機能を提供します、自動構成の多くの種類があります

a)SpringBootの起動時にメイン構成クラスをロードし、 @EnableAutoConfiguration自動設定機能がオンになっている

b)EnableAutoConfigurationImportSelectorを使用していくつかのコンポーネントをコンテナにインポートし、クラスパスを下に配置します META-INF / spring.factoriesEnableAutoConfiguration容器内の構成に追加されたすべての値(以下、部分的に自動化された構成クラスコード)。このような各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 {
    
    

}

上記の2つの例の分析を通じて、Spring Bootの自動生成メカニズムについて予備的に理解しました。将来、SpringBoot開発をより有効に活用するために、変更をカスタマイズする必要がある場合に、SpringBootが自動的にアセンブルするものを決定します。 Spring Bootが開発プラクティスにより良いサービスを提供するために、何をする必要があるか

おすすめ

転載: blog.csdn.net/weixin_45496190/article/details/107288240