回します。https://www.cnblogs.com/wenbochang/p/9851314.html
1.主なカテゴリを開始SpringBoot:
1 @SpringBootApplication 2パブリッククラスDemoApplication { 3のpublic static無効メイン(文字列[] args){ 4 5 SpringApplication.run(DemoApplication.class、引数)。 6} 7}
私たちはこの直接直接起動するたびに起動クラスは、 SpringBootは成功を開始し、私たちに自動的にクラスを設定するように多くのことを助けました。
最も重要なのは、ある @SpringBootApplication このコメントは、私たちが見にポイントします。
2. SpringBootApplicationノート:
1 @Target(ElementType.TYPE) 2 @Retention(RetentionPolicy.RUNTIME) 3 @Documented 4 @Inherited 5 @SpringBootConfiguration 6 @EnableAutoConfiguration 7 @ComponentScan(excludeFilters = { 8 @Filter(タイプ= FilterType.CUSTOM、クラス= TypeExcludeFilter.class )、 9 @Filter(タイプ= FilterType.CUSTOM、クラス= AutoConfigurationExcludeFilter.class)}) 10公衆@interfaceのSpringBootApplication {
より重要なノートの3:
-
@SpringBootConfiguration:春のブートの設定クラスは、クラスにマークされ、それは春のブート構成クラスであると言いました
-
@EnableAutoConfiguration:自動設定クラスを有効にする、エッセンスSpringBootがあります。
-
@ComponentScanパックスキャン
私たちは、自動的に設定するために私たちを助けるために、春のブートを設定するために必要なものの前に、自動設定を有効にするには、@EnableAutoConfigurationは自動設定をオンにしSpringBoot言います。
3. EnableAutoConfigurationノート:
1 @Target(ElementType.TYPE) 2 @Retention(RetentionPolicy.RUNTIME) 3 @Documented 4 @Inherited 5 @AutoConfigurationPackage 6 @import(AutoConfigurationImportSelector.class) 7パブリック@interface EnableAutoConfiguration {
より重要なノートの2:
-
@AutoConfigurationPackage:自動構成パッケージ
-
@import:コンポーネントは、自動設定を導入しました
4. AutoConfigurationPackage注解:
1つの静的クラスレジストラはImportBeanDefinitionRegistrar、DeterminableImports {実装 2 3 @Override 4公共ボイドregisterBeanDefinitions(AnnotationMetadataメタデータ、 5 BeanDefinitionRegistryレジストリ){ 6レジスタ(レジストリ、新しいPackageImport(メタデータ).getPackageName())。 7 }
これは、実際にビーンの定義が登録されています。
新しいPackageImport(メタデータ).getPackageName()は 、 それが実際のメインプログラムの電流に戻され 、同じレベルと下位レベルの パッケージアセンブリ。
一例として、上記図、DemoApplicationデモパッケージと同じレベルにあるが、このクラスはDemoApplicationのDEMO2親、兄弟、及び例えばパッケージであります
言い換えれば、DemoApplication豆のブートローダー、と我々は最も先進的なプロジェクトにDemoApplicationなければならない理由である、DEMO2ロードされません。
5.インポート(AutoConfigurationImportSelector.class)注解:
図からわかるように AutoConfigurationImportSelectorは継承された DeferredImportSelectorがImportSelectorを継承しました
ImportSelector方法がある:selectImports。
1 @Override 2パブリック文字列[] selectImports(AnnotationMetadata annotationMetadata){ 3 {IF(ISENABLED(annotationMetadata)!) 4戻りNO_IMPORTS。 5} 6 AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader 7 .loadMetadata(this.beanClassLoader)。 8 AnnotationAttributes属性=のgetAttributes(annotationMetadata)。 9リストの<string>構成= getCandidateConfigurations(annotationMetadata、 10の属性)。 11の構成= removeDuplicates(構成)。 12セットの<string>除外=のgetExclusions(annotationMetadata、属性)。 13 checkExcludedClasses(構成、除外)。 14 configurations.removeAll(除外)。 15の構成=フィルタ(構成、autoConfigurationMetadata)。 16 fireAutoConfigurationImportEvents(構成、除外)。 17リターンStringUtils.toStringArray(構成)。 18}
あなたはそれをロードするために実際にある、9行目を見ることができる のpublic static final String型FACTORIES_RESOURCE_LOCATION =「META ; -INF / spring.factories」 外部ファイルを。この外部ファイルは、自動設定には多くの種類があります。次のように:
あなた自身の豆をカスタマイズする方法6:
ここでは、例をRedisTemplate:
1 @Configuration 2 @ConditionalOnClass(RedisOperations.class) 3 @EnableConfigurationProperties(RedisProperties.class) 4 @Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class }) 5 public class RedisAutoConfiguration { 6 7 @Bean 8 @ConditionalOnMissingBean(name = "redisTemplate") 9 public RedisTemplate<Object, Object> redisTemplate( 10 RedisConnectionFactory redisConnectionFactory) throws UnknownHostException { 11 RedisTemplate<Object, Object> template = new RedisTemplate<>(); 12 template.setConnectionFactory(redisConnectionFactory); 13 return template; 14 } 15 16 @Bean 17 @ConditionalOnMissingBean 18 public StringRedisTemplate stringRedisTemplate( 19 RedisConnectionFactory redisConnectionFactory) throws UnknownHostException { 20 StringRedisTemplate template = new StringRedisTemplate(); 21 template.setConnectionFactory(redisConnectionFactory); 22 return template; 23 } 24 25 }
我们每次在Spring中使用Redis,都会使用到RedisTemplate这个工具类,但是他默认给我们返回的这个工具类,可能不是很符合我们的要求。比如:我们想要开启事务,或者想要改变它默认的序列化。
这时候该如何去做呢?
根据前面的分析,只要我们在容器中放入一个RedisTemplate Bean即可。
1 @Bean("redisTemplate") 2 public RedisTemplate<Object, Object> myRedisTemplate( 3 RedisConnectionFactory redisConnectionFactory) { 4 RedisTemplate<Object, Object> template = new RedisTemplate<>(); 5 template.setConnectionFactory(redisConnectionFactory); 6 // 修改序列化为Jackson 7 template.setDefaultSerializer(new GenericJackson2JsonRedisSerializer()); 8 // 开启事务 9 template.setEnableTransactionSupport(true); 10 return template; 11 }
我们自己定义我们的RedisTemplate模板,修改序列化,开启事务等操作。
我们将我们自己的Bean加入到IoC容器中以后,他就会默认的覆盖掉原来的RedisTemplate,达到定制的效果。
我们在以Kafka为例:
假设我们想要消费的对象不是字符串,而是一个对象呢?比如Person对象,或者其他Object类呢?
1:私たちは、最初に探しに行きましたKafkaAutoConfiguration(xxxAutoConfiguration)約あるかどうかを確認、シリアライザの構成プロパティ
2:私達は行かなかったと仮定KafkaPropertiesがファイルがあるかどうかを見つけるシリアライザの設定が
その後、直接application.propertiesのようなデフォルトの直列化を変更、でも豆が自分を書き換える必要はありません。
同様にこれは、JSONスプリングシリアライズ、シリアライズは自動的にサードパーティのフレームワークを使用することができ、そのようなアブロ、Protobuff等を提供するために使用することができます
1 spring.kafka.producer.key-シリアライザ= org.springframework.kafka.support.serializer.JsonSerializer 2 spring.kafka.producer.value-シリアライザ= org.springframework.kafka.support.serializer.JsonSerializer 3 spring.kafka.consumer .KEY-デシリアライザ= com.example.common.MyJson 4 spring.kafka.consumer.value-デシリアライザ= com.example.common.MyJson