最初は、入力アプリケーションクラスコードspringbootです
@SpringBootApplication パブリッククラスHelloApplication { パブリック静的無効メイン(文字列[] args){ SpringApplication.run(HelloApplication.class、引数)。 } }
@SpringBootApplication注釈付きソースコード
/ **
*このクラスは、現在のプロジェクトspringbootである
* /
コメント、クラス、インタフェース、抽象クラスやその他で使用するターゲット//標準
@Target(ElementType.TYPE)
//ランのためのコメント期間を宣言
@Retention(RetentionPolicy .RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters @Filter = {(タイプ= FilterType.CUSTOM、クラス= TypeExcludeFilter.class)、
@Filter(タイプ= FilterType.CUSTOM、クラス= AutoConfigurationExcludeFilter.class)})
@interface SpringBootApplication {公共
......
}
コメントは主に@ SpringBootConfiguration、@ EnableAutoConfiguration、@ ComponentScan 3つの音からなることで、ノートの組み合わせであることが理解できる、のが一つずつ3つの音を分析してみましょう。
@SpringBootConfiguration
/ ** *現在のクラスSpringBootアプリケーションを示している * / @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration 公衆@interfaceのSpringBootConfiguration { @AliasFor(注釈= Configuration.class) ブールproxyBeanMethods()真のデフォルトへ; }
これは、注釈機能がSpringBootプロジェクトBeanが@Beanを介して注入することができるよう@SpringBootConfiguration現在のクラスがSpringBoot構成、クラスのメインメソッドで示されているから見ることができます。
@EnableAutoConfiguration
/ ** *自動的に(スタータモードへ)ジャーを導入することによって構成されるスプリングアプリケーションコンテキストが開始されると、自動設定ニーズが推測する *豆の *使用@SpringBootApplication注釈が自動的に開き、構成コンテキスト * / @Target(のElementType .TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @import(AutoConfigurationImportSelector.class) パブリック@interfaceのEnableAutoConfiguration { 文字列ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration"; / ** *自動設定このような特定のクラスの除外彼らはそれが適用されることがないように、自動構成の特定のクラスを除外するために適用されることがないこと。 * @return排除するためのクラス * / クラス[](除外){}デフォルト<?>。 / ** *具体的な自動構成クラス名の除外 、彼らがするんように自動的にそれが適用されることはありませんのでことを、特定のクラス名を除外するように設定されていない *応用を。 * @Return除外するに、クラス名で * @since 1.3.0 * / String []型excludeName(){}既定; }
文字通り自動的に開くように構成されたように春の注釈は、他の一般的な注釈に似ていますが、コメントはまだ2つのノートのAutoConfigurationPackage @ 1からなる、音符の組み合わせで、インポート@
@AutoConfigurationPackage
/ ** *自動設定パケットを示す * @import注釈示すインポート容器AutoConfigurationPackages.Registrar * / @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @import(AutoConfigurationPackages.Registrar.class) @interface AutoConfigurationPackage {公共 }
AutoConfigurationPackagesソースを参照のブログ(https://blog.csdn.net/andy_zhang2007/article/details/78652907)
/ ** *クラスの後のための保存の自動設定リファレンスパッケージの *(JPAエンティティスキャナによってEG)。 *自動的に後で参照する抽象クラス(例えば、JPAエンティティスキャナ)のためのパケットを記憶するように構成された * / 抽象国民をAutoConfigurationPackages {クラス //ログslfj プライベート静的ロガー=最終LogFactory.getLogログ(AutoConfigurationPackages.class); プライベート静的な文字列BEAN =最終AutoConfigurationPackages.class.getName(); / ** * IF自動設定[用基本パッケージを決定します与えられた *ビーンファクトリ可能です。 *ビーンファクトリは、特定のパッケージのために決定され、実質的に利用可能である自動設定 * @paramのビーンファクトリたBeanFactoryソース * trueに@return利用できる自動設定パッケージがある場合 *は/ パブリック静的ブールが持っている(たBeanFactoryたBeanFactory){ リターンbeanFactory.containsBean(BEAN)&&取得(たBeanFactory).isEmpty()!; } / ** *指定された豆の工場の自動コンフィギュレーションの基本パッケージを返します。 *返回给定豆工厂的自动配置基本包 * @paramたBeanFactoryソースBean工場 *自動構成パッケージの@returnリスト * @throws IllegalStateExceptionが自動設定が有効になっていない場合 * / パブリック静的リストを<文字列>を取得(たBeanFactoryたBeanFactory){ 試み{ リターンbeanFactory.getBean(BEAN、BasePackages.class)に.get(); } キャッチ(NoSuchBeanDefinitionException EX){ 新しいIllegalStateExceptionがスロー(「@EnableAutoConfigurationベースのパッケージを取得することができません」); } } / ** *プログラムは、自動設定パッケージ名を登録します。後続の *呼び出しは、既にされているものに与えられたパッケージ名を追加します *登録します。手動れる基本パッケージ定義するには、この方法を使用することができる * {@link BeanDefinitionRegistry}所与のために使用されています。一般的にすることをお勧めします *あなたは、このメソッドを直接呼び出して、代わりにデフォルトの規則に依存しない パッケージ名があなたの{@code @EnableAutoConfiguration}から設定されている* *コンフィギュレーションクラスまたはクラス。 * / パブリック静的な無効レジスタ(BeanDefinitionRegistryレジストリ、文字列...パッケージ名){ * @paramレジストリBean定義レジストリ セットに* @paramパッケージ名パッケージ名 beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE)。 IF(registry.containsBeanDefinition(BEAN)){ BeanDefinition beanDefinition = registry.getBeanDefinition(BEAN)。 ConstructorArgumentValues constructorArguments = beanDefinition.getConstructorArgumentValues()。 constructorArguments.addIndexedArgumentValue(0、addBasePackages(constructorArguments、パッケージ名)); } 他{ GenericBeanDefinition beanDefinition)は(新しいGenericBeanDefinitionを=。 beanDefinition.setBeanClass(BasePackages.class)。 beanDefinition.getConstructorArgumentValues()addIndexedArgumentValue(0、パッケージ名)。 registry.registerBeanDefinition(BEAN、beanDefinition)。 } } プライベート静的な文字列[] addBasePackages(ConstructorArgumentValuesのconstructorArguments、文字列[]パッケージ名){ 文字列[]既存=(文字列[])constructorArguments.getIndexedArgumentValue(0、文字列[]クラス。)以降.getvalue(); セット<String>は合併=新しいLinkedHashSetのを<>(); merged.addAll(は、Arrays.asList(既存の)); merged.addAll(は、Arrays.asList(パッケージ名)); リターンStringUtils.toStringArray(合併); } / ** * {@link ImportBeanDefinitionRegistrar}から基本パッケージを格納するための インポート構成*。 *用于存储导入配置的基本包 * / 静的クラスレジストラ実装ImportBeanDefinitionRegistrar、DeterminableImports { @Override 公共空registerBeanDefinitions(AnnotationMetadataメタデータ、BeanDefinitionRegistryレジストリ){ レジスタ(レジストリ、新しいPackageImport(メタデータ).getPackageName()); } @Override 公共セット<オブジェクト> determineImports(AnnotationMetadataメタデータ){ リターンCollections.singleton(新しいPackageImport(メタデータ))。 } } / ** *ラッパーパッケージのインポートのために。 *包装导入的包 * / プライベート静的最終的なクラスPackageImport { 民間最終列のpackageName。 PackageImport(AnnotationMetadataメタデータ){ this.packageName = ClassUtils.getPackageName(metadata.getClassName())。 } 文字列getPackageName(){ 戻りthis.packageName。 } @Override パブリックブールのequals(オブジェクトobj){ 場合(OBJ == nullの||のgetClass()= obj.getClass()!){ リターンはfalse; } 戻りthis.packageName.equals(((PackageImport)OBJ).packageName)。 } @Override 公共int型のハッシュコード(){ 戻りthis.packageName.hashCode()。 } @Override パブリック文字列のtoString(){ 戻り"パッケージのインポート" + this.packageName。 } } / ** *ベースパッケージのホルダー(名前は何走査を示さないため、ヌルであってもよいです)。 * / 静的、最終的なクラスBasePackages { 民間最終リスト<文字列>のパッケージ。 プライベートブールloggedBasePackageInfo。 BasePackages(文字列...名){ リスト<文字列>パッケージ=新しいArrayListを<>(); 用(文字列名:名){ IF(StringUtils.hasText(名)){ packages.add(名); } } this.packages =パッケージ。 } リスト<文字列>(取得){ 場合(!this.loggedBasePackageInfo){ (this.packages.isEmpty()){場合 であれば(logger.isWarnEnabled()){ logger.warn( "EnableAutoConfiguration @クラスで宣言されました" +「デフォルト・パッケージでの自動@Repositoryと」 +「@Entityスキャンが有効になっていません。」); } } 他{ IF(logger.isDebugEnabled()){ 文字列パッケージ名= StringUtils.collectionToCommaDelimitedString(this.packages)。 logger.debug(「+パッケージ名「EnableAutoConfiguration @パッケージ内のクラスで宣言された」 「自動@Repositoryと@Entityスキャンが有効になっています。。」+」); } } this.loggedBasePackageInfo = TRUE。 } 戻りthis.packages。 } } }
@import(AutoConfigurationImportSelector.class)
@importは、インポート要素AutoConfigurationImportSelectorクラスを表します。
AutoConfigurationImportSelector容器は、自動コンフィギュレーションクラス(xxxAutoConfiguration)所望のシーンに容器に導入、すべてのコンポーネント、これらのコンポーネントの構成の多くを導入する表します
現在のクラスの@ComponentScan範囲スキャンパッケージ構成、デフォルトスキャンパッケージ及びそのサブパケットです。
概要:@SpringBootApplicationコメントspringbootはSpringBootクラスコンフィギュレーションとして現在のクラスは、それが現在では可能であることを注釈ノートの組み合わせ、@ SpringBootConfiguration、@ EnableAutoConfiguration、@ ComponentScan 3つの音の組み合わせがSpringBootConfigurationノート@、一緒にあるプロジェクトの中核でありますEnableAutoConfigurationコメントを自動的に構成を示すなっている@、道@Beanによって容器にアセンブリ注入クラスは、私たちがイニシエータに応じて、必要なコンポーネントをインポートし、私たちは自動的にインポート設定をするのに役立つが、@ ComponentScanスキャン設定パッケージを示す私たちの推測をSpringBoot範囲は、現在のクラスは、デフォルトのスキャンパッケージだけでなく、そのサブパケットです。
(原因SpringBootの印象的な十分ではないの著者の理解の限られたレベルに、学習の未来に、我々は、ブログ、完璧の内容を変更していきます。)