SpringBootスタートアップクラスの@SpringBootApplicationアノテーションの背後にある秘密

SpringBootプロジェクトを使用すると、何をしてもスタートアップクラスが切り離せないことがわかります。これがプログラムへの唯一のエントリポイントなので、彼は私たちのために何をしてくれましたか?この記事では、主に@SpringBootApplicationを分析します。

1.スタートアップ

@SpringBootApplication
public class Application {
    
    
	
	public static void main(String[] args) {
    
     
		SpringApplication.run(Application.class,args); 
	}
	
}

二、@ SpringBootApplication

@SpringBootApplication:特定のクラスのSpring Bootアプリケーションアノテーションは、このクラスがSpringBootのメイン構成クラスであることを示しています。

SpringBootは、このクラスのmainメソッドを実行して、SpringBootアプリケーションを起動する必要があります。

関連する構成の起動は、この注釈によって行われ、完了に役立ちます。クリックして確認してください

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
    
    
		@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
    
    

}

クリックすると、カスタムの組み合わせアノテーションであるアノテーションクラスにまだ多くのアノテーションがあることがわかります。

次に、彼の組み合わせの注釈を1つずつ説明しましょう。

1、@ Target(ElementType.TYPE)

@Targetは、アノテーションによって変更されたオブジェクトの範囲を説明します。
値(ElementType)は次のとおりです。

1. CONSTRUCTOR:コンストラクターの説明に使用
2. FIELD:ドメインの説明に使用
3. LOCAL_VARIABLE:ローカル変数の説明に使用
4. METHOD:メソッドの説明に使用
5. PACKAGE:パッケージの説明に使用
6. PARAMETER:使用パラメータを記述するために
7.TYPE:クラス、インターフェイス(注釈タイプを含む)、または列挙型ステートメントを記述するために使用されます

2、@ Retention(RetentionPolicy.RUNTIME)

注釈は、ライフサイクルに応じて3つのカテゴリに分類できます。

1. RetentionPolicy.SOURCE:アノテーションはソースファイルにのみ保持されます。Javaファイルがクラスファイルにコンパイルされると、アノテーションは破棄されます
。2。RetentionPolicy.CLASS:アノテーションはクラスファイルに保持されますが、jvmクラスファイルがロードされると破棄されます。これはデフォルトのライフサイクルです
。3。RetentionPolicy.RUNTIME:アノテーションはクラスファイルに保存されるだけでなく、JVMがクラスファイルをロードした後も存在します。

3、@文書化

この注釈は、javadocの生成時に記録されるかどうかをマークするためにのみ使用されます。

注釈をカスタマイズするときに@Documentedを使用して注釈を付けることができます。@ Documentedを使用して注釈を付けると、javadocの生成時に@Documented注釈が表示されます。

4、@継承

@AliExpressは、カスタムアノテーションで使用されるアノテーションを変更するために使用されるロゴです。

最初に注釈をカスタマイズします

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface ATable {
    
    
    public String name() default "";
}

以下は、カスタムアノテーションが使用されるシナリオです。


クラス継承関係での@AliExpressの役割クラス継承関係では、サブクラスは、親クラスで使用されるアノテーションで@合計によって変更されたアノテーションを継承します。

@ATable 
public class InheritedBase {
    
    
}
public class MyInheritedClass extends InheritedBase  {
    
    
}


インターフェイス継承関係での@Attachedの役割インターフェイス継承関係では、親インターフェイスで使用されているアノテーションが@AliExpressによって変更されているかどうかに関係なく、子インターフェイスは親インターフェイスのアノテーションを継承しません。

@ATable
public interface IInheritedInterface {
    
    
}
public interface IInheritedInterfaceChild extends IInheritedInterface {
    
    
}

クラス実装インターフェース関係における@AliExpressの役割
クラスがインターフェースを実装する場合、インターフェースで定義されたアノテーションは継承されません。

@ATable
public interface IInheritedInterface {
    
    
}
public class MyInheritedClassUseInterface implements IInheritedInterface {
    
    
}

5、@ SpringBootConfiguration

特定のクラスにマークされており、これがSpringBoot構成クラスであることを示しています

クリックすると、実際にはカスタムアノテーションであることがわかります

@Configuration Learning Springは、彼に精通している必要があります。
役割:現在のクラスが構成クラスであることを指定します。Springを使用する場合、最初はすべてxml構成です。クラス構成メソッドを開くのはこのアノテーションです。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
    
    

}

6、@ EnableAutoConfiguration

前に構成する必要があるものは、SpringBootが自動的に構成します。

@EnableAutoConfigurationは、自動構成機能をオンにするようにSpringBootに指示します。これにより、自動構成を有効にできます。

クリックすると@Importが表示されます。率直に言って、彼は@Importのサポートを使用して、特定のシナリオに関連するBean定義を収集および登録します。

@Importロール:他の構成クラスをインポートするために使用されます

また、@ EnableAutoConfigurationは、@ Importのヘルプを使用して、自動構成条件を満たすすべてのBean定義をIoCコンテナーにロードします。これ以上のことはありません。

@SuppressWarnings("deprecation")
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
    
    

}

EnableAutoConfigurationImportSelector:コンポーネント
がインポートされるセレクター。多くの自動構成クラス(xxxAutoConfiguration)がコンテナーにインポートされます。
ここに画像の説明を挿入します

おおよそのプロセスは次のとおりです。

Spring Bootが開始すると、EnableAutoConfigurationImportSelectorクラスを介して、EnableAutoConfigurationで
指定された値クラスパス(上のスクリーンショット)の下のMETA-INF / spring.factoriesから取得され
、これらの値は完全なクラス名を作成することで自動構成として使用されますリフレクション。クラスをコンテナーにインポートすると、自動構成クラスが有効に
なり、自動構成作業に役立ちます。

自分で構成する前に、自動構成クラスが構成されています。これが、springがspringbootで使用される理由であり、springmvcは、ビューリゾルバー、データベース接続プール、トランザクション、およびその他の構成を構成する必要がありません。箱から出してすぐに機能します。

もちろん、springbootは、構成を変更する方法も提供してくれました。つまり、ymlファイルまたはpropertieファイルを使用して、springbootが構成した構成のデフォルト値を変更する方法も提供しました。

7、@ ComponentScan

機能:アノテーションを使用してコンテナーを作成するときにSpringがスキャンするパッケージを指定するために使用されます

basePackagesなどの属性を使用して、@ ComponentScan自動スキャンのスコープをきめ細かくカスタマイズできます。指定しない場合、デフォルトのSpringフレームワーク実装は@ComponentScanクラスが宣言されているパッケージからスキャンします。

@ComponentScan("com.gzl")

これが、springbootスタートアップクラスがパッケージの外部に配置される理由です。

3.この注釈を使用せずにプロジェクトを開始できますか?

@SpringBootApplicationを次の3つのアノテーションに置き換えても、正常に起動できます。

package com.gzl.cn;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {
    
    
	
	public static void main(String[] args) {
    
     
		SpringApplication.run(Application.class,args); 
	}
	
}

おすすめ

転載: blog.csdn.net/weixin_43888891/article/details/110457235