1. @SpringBootApplication Annotationを使用して自動構成を達成できるのはなぜですか?
回答:@SpringBootApplication、実際には3つの内部注釈があります。 @enableautoconfiguration、@componentscan、@configuration。この記事では、主に@enablexxアノテーションについて説明しています
2。@enableautoconfigurationが使用されるのはなぜですか? @configurationPropertiesを使用すると、.ymlまたは.propertiesの構成アイテムを自動的にインポートできますか?
回答:@enableautoconfigurationの内部では、@importアノテーションが使用されます。 AutoConFigurationImportSecrecerをインポートすると、適格な構成をIOCコンテナにスプリングブートロードするのが役立ちます。ただし、SpringFactoriesLoaderの内部使用はそれを完了するために使用されます。 Java SPIと同様に、つまり、/meta-inf/spring.factoriesから構成を読み込みます
@target({elementType.type})@retention(retentionPolicy.runtime)@documented@enternited@autoconfigurationpackage@import({autoconfigurationimportsecrect.class})public @interface enableautoconfiguration@Importでは、AutoConfigurationImportSecrecerクラスが実際にインポートされていることがわかります。最も重要なことは、このクラスがインターフェイスインポートセクターを実装することです
public interface importSelector { /** *インポート@{@link configuration}クラスの{@link annotationmetadata}に基づいて、クラス(es)の名前をインポートする必要があります。 */ string [] selectimports(annotationmetadata ImportingClassMetadata);}これは、インポートセレクターの説明であり、この方法で返された豆が春までに自動的に注入および管理されることを意味します。
次に、autoconfigurationimportsecrecerでのselectimportsの実装を見てみましょう
public string [] selectimports(annotationmetadata annotationmetadata){if(!this.isenabled(annotationmetadata)){return no_imports; } else {autoconfigurationmetadata autoconfigurationmetadata = autoconfigurationmetadataloader.loadmetadata(this.beanclassoloader); annotationAttributes属性= this.getattributes(annotationmetadata); List <String> configurations = this.getCandidateConFigurations(annotationMetadata、属性);構成= this.removeduplicates(構成); <string>除外= this.getExclusions(annotationmetadata、属性); this.checkexcluedclasses(configurations、除外); Configurations.RemoveAll(除外); configurations = this.filter(configurations、autoconfigurationmetadata); this.fireautoconfigurationimportevents(構成、excclusions); return stringutils.tostringarray(configurations); }}コードは非常に明確に記述されています。説明しません。
@Importでは、リンクがImportBeanDefinitionRegistrarを指していることがわかります。これはインターフェイスでもあり、その機能はImportSelectorと同じです。
パブリックインターフェイスImportBeanDefinitionRegistrar {public void RegisterBeanDefinitions(AnnotationMetadata ImportingClassMetadata、BeanDefinitionRegistry Registry);}RegisterBeanDefinitionsメソッドでは、BeanDefinitionRegistryを使用して、注入する豆を注入できます。
コード例:
@importを使用して@Enableを自分で書いてください
1. 2つのテスト豆を作成します
パブリッククラスの役割{}パブリッククラスユーザー{}2.カスタマイズ有効な注釈
@target({elementType.type})@retention(retentionPolicy.runtime)@documented@import(myenableautoconfig.class)public @interface enablebean {}3.独自のEnableautoconfigurationクラスを実装します
パブリッククラスMyEnableAutoconfigはImportSelector {@Override public String [] Selectimports(annotationMetadata ImportingClassMetadata){new String [] {"com.xhn2.role"、 "com.xhn2.user"}; }}4。スタートアップクラスを書きます
@enableBean@componentscan( "com.xhn2")public class main {public static void main(string [] args){configureableapplicationContext = springApplication.run(main.class、args); System.out.println(context.getBean(user.class)); system.out.println(context.getBean(role.class)); }}5。操作結果
com.xhn2.user@496bc455
com.xhn2.role@59402b8f
コンソールは正常に印刷されます。
コード例2、サードパーティの瓶パッケージの自動アセンブリ
新しいMavenプロジェクト
1。pom.xml
<modelversion> 4.0.0 </modelversion> <groupid> org.csp </groupid> <artifactid> hello </artifactid> <version> 1.0.0 </version> <properties> <maven.compiler.source <project.build.sourceencoding> utf-8 </project.build.sourceencoding> </properties> <dependencies> <dependency> <groupid> org.springframework </groupid> <artifactid> spring-context </artifactid> <バージョン>
2。構成を書き込みます
@configurationpublic class mytest {@bean public runnable runnable(){return() - > {}; }}リソースの下に新しいMeta-INF/Spring.Factoriesファイルを作成し、次の構成を追加します
org.springframework.boot.autoconfigure.enableautoconfiguration = com.edu.mytest
3.プロジェクトをローカルメイブンリポジトリにインストールする:MVNインストール
4.メインプロジェクトは、地元にインストールされたばかりの瓶を紹介します。
<Dependency> <GroupId> org.csp </groupId> <artifactid> hello </artifactid> <バージョン> 1.0.0 </version> </dependency>
5.今すぐ実行可能な構成を取得します
@SpringBootApplicationPublic Class Main {public static void main(string [] args){springApplication Application = new SpringApplication(Main.Class); configureableapplicationContext context = application.run(args); System.out.println(context.getBean(runnable.class)); }}6。コンソール印刷
com.edu.mytest$$lambda$153/284686302@2c07545f
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。