JAVA、Spring、Spring Boot の関連アノテーションの紹介

0 まえがき

アノテーションは Spring Boot 開発において重要な役割を果たします。注釈は、コードに情報を追加するための形式化された方法を提供し、これにより、注釈付きオブジェクトをコード内のどこかで簡単に使用できるようになります。アノテーションの一般的な用途には、ドキュメントの生成、コードの依存関係と代替構成ファイルの追跡、コンパイル時の形式チェックの実行 (メソッド前の @Override など) などが含まれます。

この記事では、Spring Boot アノテーションと関連の深い Java アノテーション、Spring アノテーションなどを紹介します。

1. JAVA アノテーション

JRE ライブラリ パッケージ java.lang.annotation コードには、アノテーション関連のインターフェイス、クラスなどが含まれています。インタフェース java.lang.annotation.Annotation は、すべての JAVA クラスが自動的に継承する Object クラスと同様に、すべてのカスタム アノテーションが自動的に継承するインタフェースであり、定義時に指定する必要はありません。

1.1 JAVA アノテーションの概要

アノテーションは一連のメタデータであり、メタデータを使用してプログラムコード(つまり、アノテーションが付けられたオブジェクト)を説明および説明します。ただし、注釈は注釈付きコードの一部ではありません。注釈はコードの動作に直接影響しません。注釈の機能は次のとおりです。

  1. コンパイラに情報を提供します。コンパイラはアノテーションを使用してエラーや警告を検出できます。
  2. ソフトウェア ツールは、注釈情報を使用してコード、HTML ドキュメントを生成したり、その他の対応する処理を実行したりできます。
  3. 実行時処理。一部の注釈は、プログラムの実行時にコード抽出を受け入れることができます。

注釈の特定の構文を理解する前に、注釈をラベルとして考えることができます。インターフェイスやクラスと同様、アノテーションもタイプです。アノテーションは JAVA 1.5 以降に導入された概念であり、開発者が独自のアノテーション タイプを定義し、カスタム アノテーションを使用できるようになります。アノテーションはキーワード @interface で定義されます。

public @interface TestAnnotation {
    
    
    
}

上記の例のコードは、クラス java.lang.annotation.Annotation を自動的に継承する TestAnnotation という名前のアノテーションを定義します。カスタム アノテーションが作成されると、そのカスタム アノテーションを使用できるようになります。注釈は次のように使用されます。

@TestAnnotation
public class Test {
    
    
    
}

上記の例では、クラス Test を作成し、クラス定義の上に @TestAnnotation アノテーションを追加します。これは、クラス Test に TestAnnotation のアノテーションが付けられることを意味します。

1.2 JAVA のメタアノテーション

アノテーションをより適切に使用するには、メタアノテーションについても理解する必要があります。メタアノテーションは、他の一般的なアノテーションを説明、説明することを目的としたアノテーションに追加されるアノテーションです。メタアノテーションには、@Retention、@Documented、@Target、@Inherited、および @Repeatable の 5 種類があります。

  • @Retention 注釈に適用すると、注釈の有効期間を示します。その値には次のものが含まれます。

    • RetentionPolicy.SOURCE は、注釈がソース コードの段階でのみ保持され、コンパイラのコンパイル時に失われることを示します。
    • RetentionPolicy.CLASS は、アノテーションがコンパイルまで保持され、JVM にロードされないことを示します。
    • RetentionPolicy.RUNTIME は、プログラムが実行されるまで注釈が保持され、JVM にロードされ、プログラムの実行時に取得できることを示します。
    @Retention(RetentionPolicy.RUNTIME)
    public @interface TestAnnotation {
          
          
        
    }
    

    上記は、プログラムの実行中にアノテーション TestAnnotation を取得できることを意味します。

  • @Documented は、注釈の内容が Javadoc ツールによってドキュメントに抽出され、ドキュメントの内容が注釈の内容に応じて変化することを示します。

  • @Target は、型、メソッド、フィールドなど、アノテーションが使用される場所を示します。メタアノテーション @Target の値には次のものが含まれます。

    • ElementType.FIELD はフィールドの注釈と列挙定数を表します。
    • ElementType.METHOD はメソッドの注釈を表します。
    • ElementType.PARAMETER はメソッド パラメータの注釈を表します。
    • ElementType.CONSTRUCTOR はコンストラクターへの注釈を表します。
    • ElementType.LOCAL_VARIABLE はローカル変数の注釈を表します。
    • ElementType.ANNOTATION_TYPE は、注釈タイプの注釈を表します。
    • ElementType.PACKAGE はパッケージの注釈を表します。
    • ElementType.TYPE は、インターフェイス、クラス、列挙、注釈などの任意のタイプの注釈を表します。
  • @Inherited テーブルは自動的に継承されます。つまり、@Inherited によって注釈が付けられたアノテーションが親クラスに適用された後、サブクラスは親クラスのアノテーションを自動的に継承します。サンプルコードは次のとおりです。

    // 定义注解
    @Inherited
    @Retention(RetentionPoilcy.RUNTIME)
    @interface Test {
          
           }
    
    // 在父类中添加注解
    @Test
    public class A {
          
           }
    
    // 子类 B 虽然没有明确给出注解信息,但是它会继承父类 A 中的注解 @Test
    public calss B extends A {
          
           }
    
  • @Repeatable は JAVA 1.8 で導入されたアノテーションであり、それを適用したサンプルコードを以下に示します。人物は、同じ種類の異なる内容のラベルで満たされた一般的なラベルとみなすことができます。したがって、SuperMan には同時に画家、プログラマー、プロダクト マネージャーなどのラベルを付けることができます (つまり、3 つの注釈を追加します)。

    // Persons 使用数组存放注解的容器注解,它里面必须要有一个 value 属性,即数组
    @interface PerSons {
          
          
        Person[] value();
    }
    
    // 可以重复、多次应用 Persons 注解
    @Repeatable (Persons.class)
    @interface Person {
          
          
        String role default "";
    }
    
    // 不同属性的Person注解
    @Person(role="artist")
    @Person(role="coder")
    @Person(role="PM")
    public class SuperMan {
          
          
        
    }
    

1.3 注釈のプロパティ

アノテーションには属性 (メンバー変数とも呼ばれます) を持つことができ、サンプルコードは次のとおりです。カスタム アノテーション TestAnnotation には id と msg の 2 つのプロパティがあり、戻り値の型はそれぞれ int と String です。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
    
    
    int id();
    String msg();
}

注釈を使用する場合、属性に値を割り当てる必要があります。属性の割り当て方法は、次の例に示すように、アノテーションの後に括弧なしで「属性 = 値」の形式で実行され、複数の属性の割り当てはカンマで区切られます。アノテーション内の属性のタイプは、8 つの基本データ型、クラス、インターフェイス、アノテーション、およびそれらの配列のみであることに注意してください。

@TestAnnotation(id=3, msg="hello world")
public class Test {
    
     

}

アノテーション内の属性にはデフォルト値を設定できますが、キーワードdefaultでデフォルト値を指定する必要があります。サンプルコードは以下のとおりです。アノテーション TestAnnotation の属性 id のデフォルト値は -1 に指定され、属性 msg のデフォルト値は "Hi" に指定されます。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
    
    
    public int id() default -1;
    public String msg() default "Hi";
}

指定された属性のデフォルト値を追加すると、注釈 TestAnnotation の後に括弧内の属性を割り当てる必要がなくなりました。

アノテーションに属性が 1 つしかない場合、このアノテーションを適用するときに属性名を省略し、アノテーションの後の括弧内に属性値を直接入力できます。

注釈に属性がない場合は、この注釈を適用するときに注釈に続く括弧を省略できます。

1.4 JAVA プリセットの基本的なアノテーション

Java は、java.lang パッケージの下で、@Deprecated、@SuppressWarnings、@Override、@SafeVarargs、および @FunctionalInterface という 5 つのアノテーションを事前に提供します。

  • @Deprecated は、非推奨の要素をマークするために使用されます。コンパイラがコンパイル段階でこのアノテーションを検出すると、古い要素 (古いメソッド、クラス、メンバー変数など) が呼び出されていることを開発者に伝える警告を発行します。
  • @SupperssWarings は警告を防ぐことを意味します。@Deprecated アノテーションを使用した後、コンパイラーは開発者に警告リマインダーを発行することがあります。開発者が警告リマインダーを無視したい場合は、@SupperssWarings アノテーションを使用して目的を達成できます。@SupperssWarings のパラメータには次のものが含まれます。
    • 非推奨: 古い要素が使用された場合の警告を無視することを意味します。
    • unchecked: チェックされていない変換が実行された場合の警告が無視されることを示します。
    • fallthrough: スイッチ プログラム ブロックが中断せずに次のケースに直接つながる場合、警告を無視することを意味します。
    • path: クラスパスやソース ファイル パスなどのパスに存在しないパスがある場合、警告を無視することを示します。
    • Serial: シリアル化可能なクラスに SerialVersionUID 定義がない場合に警告を無視することを示します。
    • finally:finally 節が正常に完了できない場合、警告を無視することを意味します。
    • all: すべてのケースに関する警告を無視することを示します。
  • @Override は、サブクラスが親クラス (またはインターフェイス) の対応するメソッドをオーバーライドする必要があることを意味します。toString() メソッドなどの親クラスのメソッドをオーバーライドする場合は、メソッドの前に @Override を追加すると、システムがメソッドの正確性をチェックしやすくなります。サンプルコードは次のとおりです。
    // @Override 可以帮忙检查方法的正确性
    @Override
    public String toString() {
          
          ...} // 这是子类方法正确的写法
    
    // 下面子类方法是错误的,有 @Override,系统可以帮忙检查出 tostring 的拼写错误
    @Override
    public String tostring() {
          
          ...}
    
    // 下面子类方法是错误的,由于没有 @Override,系统不会帮助检查出 tostring 的拼写错误
    public String tostring() {
          
          ...}
    
  • @SafeVarargs は、パラメータに安全な型を識別するために使用されます。これは、安全でない操作を行うためにパラメータを使用しないように開発者に思い出させるために使用されます。これが存在することで、コンパイラが未チェックの警告を生成するのを防ぎます。Java 1.7 で導入されたアノテーションです。
  • @FunctionalInterface は、インターフェイスが関数型インターフェイスである必要があることを指定するために使用されます。そうでない場合は、コンパイル エラーが発生します。@FunctionalInterface は、Java 1.8 で導入された新機能です。インターフェイスに抽象メソッドが 1 つだけある場合 (複数のデフォルト メソッドまたは複数の静的メソッドを含めることができます)、そのインターフェイスは関数インターフェイスと呼ばれます。

2 Spring アノテーションとアノテーション注入

SpringコンテナはJAVAクラスをBeanとして登録して管理します。JAVAクラスをBean化するには、XML構成によりJAVAクラスをBeanとして登録する方法と、アノテーションメソッドによりJAVAクラスをBeanとして登録する方法の2通りがあります。異なるアノテーションを使用して、JAVA クラスを異なる Bean として登録できます。XML 構成と比較して、アノテーション方法はより便利で便利です。その結果、アノテーションを使用した構成をサポートし、XML 構成を放棄するツールが増えています。

2.1 Springの基本的なアノテーション

注釈 @Component はクラスの前に配置でき、Spring の通常の Bean としてマークされます。

注釈 @Controller は、クラスパス内のコンポーネントを自動的に検出し、コンポーネントを Bean として自動的に登録するために使用されるコントローラー コンポーネント クラスをマークします。たとえば、@Controller アノテーションを使用して Java クラス UserAction をマークした後、クラス UserAction を Bean としてマークし、管理のために Spring コンテナに渡す必要があることを意味します。Bean 名を指定しない場合、Bean には慣例により userAction という名前が付けられます。注釈の後の括弧内に Bean の名前を指定することもできます。たとえば、 @Controller(value="UA") または @Controller("UA") を使用して、Bean の名前を UA として指定します。

注釈 @Service は、ビジネス ロジック コンポーネント クラスをマークします。たとえば、クラス Action が UserServiceImpl インスタンスを使用する必要がある場合、 @Service("uaerService") アノテーションを使用して、Spring に UserServiceImpl インスタンス (userService という名前) を作成するように指示できます。Spring が userService を作成した後、それを Action に注入することができ、Action は UserServiceImpl インスタンスを使用できます。

注釈 @Repository は、DAO コンポーネント クラスに注釈を付けます。@Repository(value="userDao") アノテーションを使用して UserDao インスタンス (userDao という名前) を作成するように Spring に指示できます。Service が userDao を使用する必要がある場合、 @Repository(name="userDao") アノテーションを使用して、作成された userDao を Service に注入するように Spring に指示できます。

2.2 Spring の共通アノテーション

注釈 @Autowired は自動アセンブリを実装するために使用され、@Autowired はメンバー変数、メソッド、コンストラクターなどのオブジェクトをマークするために使用できます。@Autowired のアノテーション オブジェクトは異なりますが、Spring が Bean を初期化するときに自動的にアセンブルされます。@Autowired を使用すると、Spring コンテナが必要な Bean を自動的に検索し、それをパラメータとして挿入できるようになります。

@Autowiredは種類に応じて自動配線されており、サンプルコードは以下の通りです。Spring コンテキストに同じタイプの Bean が複数ある場合 (たとえば、2 つのクラスが両方とも EmployeeService インターフェースを実装している場合)、Spring はどの実装クラスをバインドする必要があるかを認識せず、BeanCreationException がスローされます。特定の種類の Bean が Spring コンテキストに存在しない場合も、BeanCreationException がスローされます。

@Autowired アノテーションが付けられたアプリケーション コードの例:

// 接口 Employeeservice 声明
public interface EmployeeService {
    
    
    public EmployeeDto getEmployeeById(Long ld);
}

// 两个实现类 EmployeeServiceImpl 和 EmployeeServiceImpl1
@Service("service")
public class EmployeeserviceImpl implements EmployeeService {
    
    
    public EmployeeDto getEmployeeById(Long id) {
    
    
        return new EmployeeDto();
    }
}

Service("service1")
public class EmployeeServiceImpll implements EmployeeService {
    
    
    public EmployeeDto getEmployeeById(Long id) {
    
    
        return new EmpioyeeDto();
    }
}

// 调用接口实现类
@Controller
@RequestMapping("/emplayee.do")
public class EmployeeInfoControl {
    
    
	@Autowired//此注解处会出错,因为有两个实现类,而不知道绑定哪一个
	EmployeeService employee5ervice;
	
    @RequestMapping(params = "method=showEmplayeeInfo")
    public void showEmplayeeInfo(HttpServletRequest request, HttpservletRespcnmresponse, EmployeeDto dto) {
    
    
        ... // 代码省略
    }
}

@Autowired とともに @Qualifier を使用すると、異常な BeanCreationlException を解決できます。サンプル コードは次のとおりです。

// 接口 Employeeservice 声明与上例一致
// 接口的两个实现类 EmployeeserviceImpl 和 EmployeeserviceImpl1 与上例一致

// 接口实现类的调用
@Controller
@RequestMapping("/emplayee.do")
public class EmployeeInfoControl {
    
    
    @Autowired
    @Qualifier( "service") // 新增加语句,指定调用第一个接口实现类
    EmployeeService employeeService;
    @RequestMapping(params = "method=showEmplayeeInfo")
    public void showEmplayeeInfo(HttpServletRequest request, HttpservletRespcnmresponse, EmployeeDto dto) {
    
    
        ... // 代码省略
    }
}

注釈 @Resource を使用して、オブジェクトの SET メソッドに注釈を付けることができます。アノテーション @Resource は、@Autowired と同等ですが、@Autowired はタイプによって自動的に挿入されるのに対し、@Resource はデフォルトで名前によって自動的に挿入されます。JSR-250 標準では、Spring 独自の @Autowired アノテーションの代わりに、汎用アノテーション @Resource を使用することが推奨されています。

JSR (Java 仕様リクエスト、Java 仕様提案) は、新しい標準化された技術仕様を追加するための JCP (Java Community Process) への正式なリクエストです。誰でも JSR を送信して、新しい API やサービスを Java プラットフォームに追加できます。JSR は Java の世界では重要な標準となっています。Spring 2.5 以降、Spring フレームワークのコアは、JSR-250 標準のアノテーション @Resource、@PostConstruct、および @PreDestroy をサポートします。

@Resource には、名前 name と属性 type という 2 つの重要な属性があります。Spring は @Resource アノテーションの name 属性を Bean の名前に解決し、type 属性を Bean のタイプに解決します。name 属性が使用されている場合は、名前による自動注入の注入戦略が使用され、type 属性が使用されている場合は、タイプによる自動注入の注入戦略が使用されます。name 属性も type 属性も指定されていない場合は、リフレクション メカニズムを通じて名前による自動注入の注入戦略が使用されます。@Resource が名前による自動注入の注入戦略を使用する場合、@Qualifier を使用して注入用の Bean の名前を明示的に指定するのと同じ効果があります。多くの同一の Bean の中で、@Primary アノテーションが付けられた Bean が優先されます。これは @Qualificr とは少し異なり、@Qualificr はインジェクションに使用される Bean を指します。

アノテーション @PostConstruct とアノテーション @PreDestroy は両方とも JSR-250 標準アノテーションです。@PreDestroy でマークされたメソッドはクラスが破棄される前に呼び出され、@PostConstruct でアノテーションが付けられたメソッドはクラスがインスタンス化された後に呼び出されます。

Spring 3.0 から、Spring は JSR-330 標準アノテーションをサポートし始めました。JSR-330 では、@Inject は Spring の @Autowired と同じ責任を持ち、@Named は Spring の @Component と同様の責任を持ちます。

アノテーション @Scope を使用して Bean のスコープ (スコープと呼ばれる) を定義することも、XML ファイルで Bean のスコープ属性の値を設定することによってこれを実現することもできます。@Scope アノテーションの値は、singleton、prototype、request、session、global scsssion などのスコープにすることができます。デフォルトは、singleton モード、つまり、scope="singleton" です。の:

  • シングルトン モード シングルトンは、グローバルにインスタンスが 1 つだけ存在することを意味します。
  • プロトタイプ モード プロトタイプは、Bean が取得されるたびに新しいインスタンスが存在することを意味します。
  • request は、HTTP リクエストごとに新しい Bean が生成され、その Bean が現在の HTTP リクエスト内でのみ有効であることを示します。
  • session は、HTTP リクエストごとに新しい Bean が生成され、その Bean が現在の HTTP セッション内でのみ有効であることを示します。
  • グローバル セッションは標準の HTTP セッションに似ていますが、ポートレット ベースの Web アプリケーションでのみ意味を持ちます。

ポートレットのリクエスト処理は、アクション フェーズとレンダリング フェーズに分かれています。リクエストでは、アクション フェーズは 1 回だけ実行されますが、レンダリング フェーズはユーザーのブラウザ アクションにより複数回実行される場合があります。ポートレット仕様は、ポートレット Web アプリケーションを構成するさまざまなポートレットすべてで共有されるグローバル セッションの概念を定義します。グローバル セッションで定義された Bean のスコープは、ポートレットのグローバル セッション (グローバル scsssion) の存続期間に限定されます。WebでBeanを識別するためにグローバルセッションを使用すると、セッションタイプとして自動的にWebが使用されます。

JSR-330 のデフォルトのスコープは Spring のプロトタイプに似ており、ISR-330 標準の Bean も Spring ではデフォルトでシングルトンです。非シングルトン スコープを使用するには、開発者は Spring の @Scope アノテーションを使用する必要があります。JSR-330 は @Scope アノテーションも提供しますが、このアノテーションはカスタム スコープを作成する場合にのみ使用できます。

@RequestMapping アノテーションによりクラスまたはメソッドのマッピング パスを指定し、指定されたパスを通じて対応するクラスまたはメソッドにアクセスすることができます。適用例を次の例に示します。このうち、userid 値は @PathVariable アノテーション メソッドを通じてバインドされます。注釈 @PathVariable は主に単一の URI パラメーターを取得するために使用されますが、URI を介していくつかの複雑なパラメーターを送信する場合は、注釈 @MatrixVariable の使用を検討する必要があります。@MatrixVariable の行列変数は URI 内のどこにでも出現でき、変数はセミコロン (;) で区切られます。@MatrixVariable はデフォルトでは有効になっていません。有効にするには、enable-matrix-variablcs を true に設定する必要があります。

@RequestMapping アノテーションが付けられたサンプル アプリケーション コード。

@RequestMapping(value="/getName/{userid}", method = RequestMethod.Get)
public void login(@Pathvariable String userid, Model mcdel){
    
    
    
}

注釈 @RequestParam は、リクエスト内の値を注釈付きのメソッド パラメーターに割り当てます。次の例に示すように、リクエスト内の値 username をメソッド内の username パラメータに割り当てます。required 属性はパラメータに値を割り当てる必要があるかどうかを表し、デフォルトは true です。リクエストにパラメータに割り当てられる値があるかどうか不明な場合は、required 属性を false に設定する必要があります。

public void login(@RequestParam(value="username" required="true") String username){
    
    
}

HTTP リクエストでも HTTP レスポンスでも、メッセージはメッセージを通じて送信され、メッセージにはヘッダーとボディがあります。ヘッダーにはサーバーまたはクライアントに関する情報が含まれており、ID を示したり、認証や制限を提供したりするために使用されます。ボディは渡されるコンテンツです。注釈 @RequestBody は、リクエスト メッセージの本文をメソッド パラメーターにバインドされた変数文字列に自動的に変換します。リクエストに応答するとき、@ResponseBody はコンテンツまたは Java オブジェクトを応答メッセージの本文に変換して返します。@RequestBody 注釈は、返されたデータが HTML マークアップ ページ (ビュー) ではなく、他の形式のデータ (JSON、XML など) である場合にのみ使用されます。

注釈 @Param はパラメータの解釈を表し、通常は注釈に記述されます。

注釈 @JoinTable は、Java クラスとデータベース テーブル間のマッピング関係を示し、列マッピング、主キー マッピングなども識別できます。

@Transational アノテーションは Spring トランザクション管理用のアノテーションです。@Transational アノテーションが付与されたメソッドまたはクラスは、自動的にトランザクションとして登録され、Spring コンテナの管理を受け取ります。

@Syschronized アノテーションは Java 同期メカニズムを実装することを意味し、これをアノテーションとして使用することは同期ロックを追加することと同等です。

注釈 @ModelAttribute が属性で宣言されており、属性の値がモデル内の queryBean から取得され、モデルに保存されていることを示します。注釈 @ModelAttribute がメソッドで宣言され、メソッドの戻り値がモデルに保存されることを示します。

アノテーション @Cacheable はメソッドの戻り値をキャッシュする必要があることを示し、アノテーション @CacheFlush はメソッドがキャッシュをクリアするトリガーであることを宣言します。これら 2 つのアノテーションはキャッシュ プロセッサと組み合わせて使用​​する必要があります。

Spring では、次のリクエストが引き続きこれらの属性にアクセスできるように、ModelMap 内のどの属性をセッションにダンプする必要があるかを指定できます。注釈 @SessionAttributes はクラスにのみ注釈を付けることができ、メソッドには注釈を付けることができません。

プロパティ エディタを特定のコントローラ上でのみ動作させたい場合は、コントローラ内に @InitBinder アノテーションが付けられたメソッドを定義し、このメソッド内のコントローラに複数のプロパティ エディタを登録できます。

アノテーション @Required は、初期化中に Bean の SET メソッドが実行されるかどうかをチェックする役割を果たします。SET メソッドが呼び出されない場合、Spring は解析中に例外をスローして、開発者に対応するプロパティを設定するよう通知します。@Required アノテーションは SET メソッドでのみマークでき、非 SET メソッドでマークされた場合は無視されます。

条件付き設定機能は Spring 4.0 で導入され、@Conditional アノテーションを使用する、より一般的な条件ベースの Bean 作成方法を提供します。@Conditional は、特定の条件の満足に基づいて特定の Bean を作成します。条件付き構成では、アプリケーション内に構成が存在しますが、特定の条件が満たされるまで無視することができます。Spring ではカスタム条件を簡単に作成でき、次の例に示すように、Condition インターフェイスを実装し、そのmatches() メソッドをオーバーライドするだけです。次の例では、JdbcTemplateCondition クラスの条件が true の場合にのみ、MyService Bean が作成されます。それ以外の場合、Bean 宣言は無視されます。

//具体条件类,需实现 Condition 接口,并重写 matches(...,...) 方法
public class JdbcTemplateCondition implements Condition {
    
    
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata){
    
    
        try{
    
           
            context.getc1assLoader().1oadclass(
        "org.springframework.jdbc.core.JdbcTemplate");
            return true;
        } catch (Exception e) {
    
    
            return false;
        }
    }
                                    
    //声明bean时,使用自定义条件类,作为eConditional的参数value
	@Conditional(JdbcTemplateCondition.class)
	public MyService myService(){
    
    ...}
}

2.3 Spring アノテーションの注入

注釈の挿入は、注釈によって実現されます。Spring でのインジェクションに関連する一般的なアノテーションには、@Autowired、@Resource、@Qualifier、@Service、@Controller、@Repository、@Component などが含まれます。の:

@Autowired にアノテーションを付けて自動インジェクションを実現します。

アノテーション @Resource は、名前を指定することによって挿入されます。

注釈 @Qualifier は、名前を指定して注入する注釈 @Autowired と組み合わせて使用​​されます。

注釈 @Autowired、@Resource を使用して、フィールド、コンストラクター、メソッドに注釈を付け、それらを注入できます。

注釈 @Service、@Controller、および @Repository は、クラスに注釈を付けるために使用され、Spring が注釈が付けられたクラスをスキャンするときに Bean が生成されます。@Service、@Controller、@Repository アノテーションが付けられたクラスは、それぞれサービス層、コントロール層、データ ストレージ層に配置されます。注釈 @Component は、注釈が付けられたオブジェクトをコンポーネントとしてマークする一般的な用語です。

注釈 @EnableAspectJAutoProxy は、AOP プロキシの自動構成メカニズムを有効にすることを意味します。AOP フレームワークを使用して @EnableAspectJAutoProxy(exposeProxy=true) を設定することでプロキシ オブジェクトを公開し、aopContext がアクセスできるようにすることができます。注釈 @EnableAspectJAutoProxy の定義から、AspectJAutoProxyRegister.class オブジェクトが導入されていることがわかります。このオブジェクトは、@EnableAspectJAutoProxy 注釈でマークされた AnnotationAwareAspectJAutoProxyCreator です。

AnnotationAwareAspectJAutoProxyCreator は、AopConfigUtils クラスのメソッド registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry) を呼び出すことで、AOP プロキシ オブジェクト ジェネレーターを登録できます。

注釈 @Profiles は、アプリケーション構成を分離して、これらの構成が特定の環境でのみ有効になるようにする方法を提供します。任意のコンポーネントまたは構成クラスを @Profiles でマークして、ロード時に制限することができます。

3 Spring Boot のアノテーション

3.1 Spring Boot の基本的なアノテーション

アノテーション @SpringBootApplication は、アノテーション @Configuration、@EnableAutoConfiguration、@ComponentScan アノテーションと同等です。このうちクラスには @Configuration アノテーションが付けられており、Spring の XML 設定ファイルにおける Bean に相当します。アノテーション @EnablcAutoConfiguration は自動構成を実装します。アノテーション @ComponentSca はコンポーネントをスキャンし、Bean を自動的に検出してアセンブルし、Bean をプログラム コンテキストに追加します。

アノテーション @RestController は、アノテーション @Controller と @ResponscBody のコレクションであり、マークされたオブジェクトが REST スタイル Bean であり、メソッドの戻り値が HTTP 応答本文に直接埋められてユーザーに返されることを示します。

注釈 @JsonBackReference を使用すると、無限再帰呼び出しの問題を解決できます。注釈 @RepositoryRestResource は、RESTful エントリ ポイントを作成するために spring-boot-starter-data-rest とともに使用されます。注釈 @Import は、他の構成クラスをインポートするために使用されます。注釈 @ImportResource は、XML 構成ファイルをロードするために使用されます。

@Bean アノテーション メソッドは、XML 構成の Bean に相当します。注釈 @Value は、Spring Boot 構成ファイル application.properties で構成されたプロパティ値を挿入します。注釈 @Inject はデフォルトの @Autowired と同等ですが、必須属性がありません。

Spring Boot は多くの条件を定義し、それらを Spring Boot の自動構成を構成する構成クラスに適用します。Spring Boot によって提供される条件付きアノテーションには、@ConditionalOnBean (特定の Bean が構成されている)、@ConditionalOnMissingBean (特定の Bean が構成されていない)、@ConditionalOnClass (指定されたクラスが classPath ディレクトリにある)、@ConditionalOnMissingClass (指定されたクラスがクラスパス ディレクトリにない) が含まれます。クラスパス ディレクトリ) クラス)、@ConditionalOnExpression (指定された SpEL 式が true と評価される)、@ConditionalOnJava (Java のバージョンが特定の値または値の範囲に一致する)、@ConditionalOnJndi (クラスパス ディレクトリ内の指定された JNDI の場所に 1 つ存在する必要があります)パラメーター)、@ConditionalOnProperty (指定された構成プロパティには明示的な値があります)、@ConditionalOnResource (クラスパス ディレクトリには指定されたリソースがあります)、@ConditionalOnWebApplication (Web アプリケーションです)、@ConditionalOnNotWcbApplication (Web アプリケーションではありません)。

3.2 JPA アノテーション

アノテーション @Entity はマークされたオブジェクトがエンティティ クラスであることを示し、アノテーション @Table(name=" ") はエンティティに対応するテーブル名を示し、通常、これら 2 つのアノテーションは併用されます。ただし、テーブル名がエンティティクラス名と同じ場合は、@Table を省略できます。

開発プロジェクトに取り組む場合、エンティティ クラスをデータベース テーブルにマッピングする操作がよく使用されます。場合によっては、マップする必要がある複数のエンティティ クラスが、番号 ID、作成者、作成時間、備考などの共通の属性を持っていることがあります。このとき、これらの属性を親クラスに抽象化し、各エンティティ クラスがこの親クラスを継承することができます。@MappedSuperclass アノテーションを使用して、データベース テーブルにマップされない親クラスにアノテーションを付けることができますが、サブクラスはマッピング時に親クラスのマッピング プロパティを自動的にスキャンし、これらのプロパティを、サブクラス。@MappedSuperclass アノテーションを使用した後は、@Entity アノテーションまたは @Table アノテーションを使用できなくなります。

SpringData は多くの DAO インターフェイスを提供しますが、それでも日常的なアプリケーションのニーズを満たしていない可能性があり、カスタム リポジトリの実装が必要です。@NoRepositoryBean アノテーションは通常、親クラスの Repository として使用されますが、このアノテーションを使用すると Spring は Repository をインスタンス化しません。

注釈 @Column は、エンティティ クラスの属性とデータ テーブルのフィールド間の対応を識別します。@Columnアノテーションのフィールド名がカラム名と同じ場合は省略可能です。@Column アノテーションには合計 10 個の属性があり、それらはすべてオプションです。共通の属性には、名前、一意、NULL 可能、テーブル、長さ、精度、スケールなどが含まれます。このうち、name 属性は、データベース テーブル内のラベル付きフィールドに対応するフィールドの名前を定義します。unique 属性は、フィールドが一意の識別子であるかどうかを示し、デフォルト値は false です。テーブル内に一意に識別する必要があるフィールドがある場合は、このタグを使用するか、@Table タグで @UniqueConstraint を使用できます。nullable 属性は、フィールドが null 値になれるかどうかを示し、デフォルト値は true です。table 属性は、現在のフィールドを含むテーブルの名前を定義します。length 属性はフィールドの長さを示します。この属性はフィールドのタイプが varchar の場合にのみ有効で、デフォルト値は 255 文字です。precision 属性とscale 属性は精度を表し、フィールド型が double の場合、precision は値の全長を表し、scale は小数点が占める桁数を表します。

注釈 @Id は、エンティティ クラスの属性がデータベースの主キー列にマップされることを宣言するために使用されます。属性は通常、属性宣言ステートメントの前に配置され、宣言ステートメントと一緒に記述することも、別の行に記述することもできます。@Id アノテーションは、プロパティのゲッター メソッドの前に配置することもできます。

注釈 @GeneratedValue は主キーの生成戦略をマークするために使用され、戦略は属性戦略を通じて指定されます。たとえば、注釈 @GeneratedValue(strategy=GenerationType.SEQUENCE) は主キー生成戦略が scquence であることを示し、@GeneratedValue(generator="repair_scq") はシーケンス名がrepair_seq であることを指定します。

IDENTITY、AUTO、SEQUENCE などのいくつかの代替戦略が javax.persistcnce.GenerationTypec で定義されています。このうち、IDENTITY 戦略は、データベース ID の自己成長方式を使用して主キー フィールドを増やすことを意味します。Oracle はこの方式をサポートしていません。SEQUENCE は、主キーがシーケンスによって生成され、シーケンス名がシーケンスによって指定されることを意味します。 @SequenceGenerator アノテーション。MySOL はこのメソッドをサポートしていません。デフォルトでは、JPA は基になるデータベースに最適な主キー生成戦略を自動的に選択します。たとえば、SQL Server のデフォルト戦略は ID で、MySQL のデフォルト戦略は自動インクリメントです。注釈 @SequenceGeneretor(name = "repair_seq", sequenceName = "seq_repair", AllocationSize=1) 内の名前はシーケンスの名前であるため、sequenceName はデータベースのシーケンス名として使用でき、2 つの名前は使用できます。一貫性を保つこと。

注釈 @Transient は、マークされた属性がデータベース テーブルのフィールドへのマッピングではなく、オブジェクト リレーショナル マッピング (Objcct リレーショナル マッピング、ORM) フレームワークがこの属性を無視することを示します。属性がデータベース テーブルのフィールド マッピングではない場合は、@Transicnt としてマークする必要があります。そうでない場合、ORM フレームワークはデフォルトでその注釈を @Basic として使用します。アノテーション @Basic(fetch=FctcbType.LAZY) でエンティティ属性のロード方法を指定できます。

アノテーション @Jsonlgnore の機能は、JSON シリアル化中に Java Bean の一部のプロパティを無視することであり、シリアル化と逆シリアル化の両方が影響を受けます。たとえば、返される JSON データに、属性 GoodsInfo および extendsInfo のスナップショット値が含まれないようにしたい場合は、エンティティ クラスのスナップショット属性に @JsonIgnore を追加するだけで、返される JSON データには 2 つの属性値が含まれなくなります。 GoodsInfo と extendsInfo の

注釈 @JoinColumn(name="loginld") は、テーブルに別のテーブルを指す外部キーがあることを示します。パーソン テーブルとアドレス テーブルが 1 対 1 の関係にあると仮定すると、パーソンには、アドレス テーブルの主キーを指すフィールド addressID があり、注釈 @JoinColumn を使用して addressID に注釈を付けることができます。@OncToOne、@OneToMany、@ManyToOne、@ManyToMany は、Hibernate 設定ファイル内の 1 対 1、対多、多対 1、多対多の関係に対応します。@ManyToOne は中間テーブルを生成しません。@Joincolumn(name=" ") を使用して外部キーの名前を指定できます。@OneToMany は中間テーブルを生成します。@onetoMany @Joincolumn(name=" ") を使用して中間テーブルの生成を回避し、外部キーの名前を指定できます。

3.3 例外処理のアノテーション

注釈 @ControllerAdvice には、スキャンして例外を均一に処理できる注釈 @Component が含まれています。

注釈 @ExccptionHandler(Exception.class) は、この例外が発生したときに注釈付きメソッドが実行されることを示すためにメソッドで使用されます。

3.4 アノテーション構成解析と利用環境

注釈 @PreUpdate は、対応するライフサイクル イベントのコールバック メソッドを指定するために使用されます。このアノテーションは、エンティティ クラス、マップされたスーパークラス、またはコールバック リスナー クラスのメソッドに適用できます。エンティティが更新されるたびにプロパティを更新したい場合は、 @PreUpdate アノテーションを使用できます。注釈 @PreUpdate ではエンティティの変更は許可されません。

注釈 @PrePersist は、永続化の前にエンティティ プロパティを自動入力するのに役立ちます。@PrePersist イベントはpersist()メソッドが呼び出された直後に発生し、この時点のデータは実際にはデータベースに挿入されていません。JPA を使用する場合、最終更新時刻など、ビジネスに依存しないフィールドを記録するために使用できます。ライフサイクル メソッドのアノテーション (ライフサイクルを削除しない) イベント @PrePersist は保存前に呼び出され、アノテーション @PostPersist は保存後に呼び出されます。 @PostPersist イベントは、データがデータベースに挿入された後に発生します。

@PostLoadアノテーションはEntityのマッピング後に呼び出され、@EntityListenersアノテーションは外部ライフ同期イベントの実装クラスを指定します。アノテーション @PostLoad イベントは、エンティティをロードする EntityManager.find() または getreference() メソッドの実行後、JPA SQL クエリの実行後、または EntityManager.refresh() メソッドの呼び出し後に実行されます。

注釈 @PreRemove および注釈 @PostRemove イベントは、エンティティの削除によってトリガーされます。注釈付きの @PreRemove イベントは、エンティティがデータベースから削除される前に発生します。注釈付きの @PostRemove イベントは、エンティティがデータベースから削除された後に発生します。

注釈 @NoArgsConstructor はパラメーターなしのコンストラクターを提供します。注釈 @AllArgsConstructor は、完全なパラメーターのコンストラクターを提供します。

おすすめ

転載: blog.csdn.net/meng_xin_true/article/details/129935169