Spring IOCアノテーション構成

Spring IOCアノテーション構成

(1)簡単な説明

前回述べたように、XML構成ファイルを作成する方法を使用して、Springに必要なBeanオブジェクトを生成させ、それらをコンテナーに入れることができます。ただし、構成ファイルの書き込みは非常に面倒な作業であり、構成ファイルに多くのコンテンツが含まれると、読み取るのも面倒なので、構成ファイルを部分的または完全に取り除く構成方法が緊急に必要です。

Springのアノテーション設定メソッドを見てみましょう。アノテーション構成は構成ファイル構成と比較され、構成の形式のみが異なり、最終的な目標は基本的に同じです。飛行機で北京に行くのと同じように、高速鉄道で北京に行くのですが、交通手段は異なりますが、どちらも北京に行くという目標を達成しています。

(2)アノテーション分類

構成に使用される注釈は、オブジェクトの作成に使用される注釈、データの注入に使用される注釈、スコープの変更に使用される注釈、およびライフサイクルにロジックを追加するために使用される注釈に大別できます。これらの注釈は、XMLファイルの構成コンテンツの一部を置き換えますが、XMLファイルを完全に取り除くことはできません(後でXMLファイルを完全に取り除く方法)。

まず、XMLでコンテキスト名前空間を導入する必要があります。

ここに画像の説明を挿入

公式文書に直接テンプレートを与える:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

</beans>

次に、スキャナーを追加して、オブジェクトをインスタンス化してSpring IOCコンテナーに含める前に、Springがオブジェクトを作成するための注釈付きのクラスを見つけることができるようにする必要があります。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">
        
	<context:component-scan base-package="com.demo" />
</beans>

ここでの基本パッケージとは、コンテナーに追加する必要のあるすべてのBeanが配置されているパッケージを指します。スキャナーを使用して、これらの4種類の注釈の使用方法を見てみましょう。

1.オブジェクトの作成に使用されます

@ Component、@ Controller、@ Service、@ Repositoryの合計4つのアノテーションがあり、それらの役割は、XML構成ファイルに<bean />タグを書き込むことと同等です。

まず、@ Componentアノテーションを見てみましょう。その機能は、現在のオブジェクトをSpring IOCコンテナに格納することです。@Componentは一般的な名前であり、通常はSpringで管理できるすべてのコンポーネントを指します。@ Controller、@ Service、@ Repositoryは@Componentの拡張であり、通常、特定の状況でコンポーネントを表すために使用され、Springフレームワークはこのアプリケーションシナリオに従っていくつかのカスタマイズを行います。たとえば、@ Repositoryにも自動例外変換があります。@RepositoryはDaoレイヤーコンポーネントを表すために使用され、@ Serviceはサービスレイヤーコンポーネントを表すために使用され、@ Controllerはコントローラーレイヤーコンポーネントを表すために使用されます。

したがって、特別なカスタマイズが考慮されていない場合、これらの4つの注釈はまったく同じであり、混在させることができます。ただし、一般的にはコンポーネントの性質に応じて選択します。見てみましょう:

package com.demo;

import org.springframework.stereotype.Repository;

@Repository
public class UserDao {
    
    
    public void getUser(){
    
    
        System.out.println("getUser被调用了");
    }
}

これらの4つの注釈には、Beanオブジェクトの名前を指定するパラメーターがあります。これを記述しない場合(ここでは記述していません)、デフォルトはクラス名であり、最初の文字が小文字に変更されます。この注釈は、XMLで構成したものと同等です。

<bean id="userDao" class="com.demo.UserDao" />

2.データの注入に使用

オブジェクトを使用して、データを挿入することもできます。このタイプの一般的に使用される注釈は、@ Value、@ Autowired、@ Resourceです。これら3つの注釈の関数は、<bean />タグの<property />タグと同等であり、@ Valueは、基本的な型が注入されますが、他の2つはオブジェクト型の注入(依存性注入)を担当します。

@Valueには何も言うことはありません。注入する値をアノテーション属性に書き込むだけで、他の2つは少し複雑になる可能性があります。

@Autowiredのデフォルトでは、型一致メソッドに従って注入します。これは、メンバー変数、セッターメソッド、コンストラクター関数などに使用できます。@ Autowiredアノテーションを使用すると、型に一致するBeanオブジェクトが1つだけ必要です(複数の一致するBeanがある場合)。現時点では、名前に従って一致します。一致するオブジェクトが見つからない場合、Springコンテナは例外をスローします(例外をスローしたくない場合は、アノテーションに属性を追加できます:required = false)。@Qualifierアノテーションを使用して、注入されたBeanオブジェクトの名前を指定することもできます。@ Autowiredと@Qualifierを組み合わせて使用​​すると、自動注入戦略がタイプによるマッチングから名前によるマッチングに変わります。

ここに画像の説明を挿入

ここに画像の説明を挿入
@Resourceアノテーションを使用した後、Springはアノテーションの名前属性が空かどうかを判断します。空の場合、現在の属性名とSpring IOCコンテナー内のBeanオブジェクトの名前を照合します。一致が成功した場合は割り当てられます。一致が失敗した場合は、 Spring構成ファイルのクラスタイプに従って一致しますが、それでも一致しない場合は、エラーが報告されます。name属性がある場合は、name属性の値とSpring IOCコンテナー内のBeanオブジェクトの名前に従って照合されます。一致が成功した場合は割り当てられ、失敗した場合はエラーが報告されます。

ここに画像の説明を挿入

3.アクションの範囲を変更するために使用されます

このタイプの注釈は1つだけ、つまり@Scopeです。これは、<bean />タグのscope属性に相当します。

@Scopeは、Beanオブジェクトのスコープを変更するために使用されます。属性には、XML構成と同じ次の値を入力できます。

  1. シングルトン:シングルトンモード
  2. プロトタイプ:複数ケースモード
  3. リクエスト:ドメインをリクエストし、Web環境にある必要があります
  4. セッション:セッションドメイン、Web環境にある必要があります
  5. アプリケーション:コンテキストドメイン、Web環境にある必要があります
  6. globalsessionクラスター環境のセッションドメインは、Web環境にある必要があります。

4.ライフサイクルにロジックを追加するために使用されます

アノテーションには、@ PostConstructと@PreDestroyという2つの主要なタイプがあります。これらはメソッドで使用され、<bean />タグのinit-methodおよびdestroy-method属性に相当します。

    @PostConstruct
    public void init() {
    
    
    	System.out.println("初始化方法......");
    }
    
    @PreDestroy
    public void destroy() {
    
    
    	System.out.println("销毁方法......");
    }

たくさんのアノテーションを読んだら、まとめましょう実際、ここの各アノテーションは前のXMLの構成関数に対応しているので、メモリに簡単に対応できます。

の種類 注釈 対応するXML要素
オブジェクトの作成に使用されます @ Component、@ Controller、@ Service、@ Repository <bean />タグ
データを注入するために使用 @ Value、@ Autowired、@ Resource <bean />タグ内の<property />タグ
アクションの範囲を変更するために使用されます @範囲 <bean />タグのスコープ属性
ライフサイクルにロジックを追加するために使用されます @ PostConstruct、@ PreDestroy <bean />タグのinit-method属性とdestroy-method属性

(3)純粋なアノテーション設定

純粋なアノテーション構成により、最終的にXMLファイルを放棄できますが、彼の機能を置き換える構成クラスを作成する必要があります。

この構成クラスに何が含まれるかを考えてみましょうまず、Springはそれが構成クラスであることをどのようにして知るのでしょうか。構成クラスに特別なアノテーションを追加する必要があります。このアノテーションは@Configurationです。このアノテーションを使用すると、このクラスは構成クラスとして扱われます。

次に、以前にスキャナーをXMLで構成したことについても話しました。これは構成クラスのアノテーションにもなりました。彼は@ComponentScanであり、春のスキャンが必要なパッケージに入力するだけです。ここで複数のパッケージを入力する場合は、配列形式で書き込む必要があることに注意してください。例を見てみましょう:

package com.demo;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("com.demo")
public class Config {
    
    

}
package com.demo;

import org.springframework.stereotype.Repository;

@Repository
public class UserDao {
    
    
    public void getUser(){
    
    
        System.out.println("getUser被调用了");
    }
}

package com.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.stereotype.Service;

@Service
public class UserService {
    
    
    @Autowired
    private UserDao userDao;

    public void get(){
    
    
        userDao.getUser();
}

この例は非常に簡潔であり、主な目的は純粋なアノテーション設定モードを示すことです。明らかに、以前にXMLで構成したもののどれも欠けていませんでした。これは、私が以前言ったことも確認します。XML構成と注釈構成ですが、形式は異なりますが、最終的な目標は基本的に同じです。何?構成クラスを保存できますか?私よりも怠惰な人はいますか?もちろん、それは可能ですが、外に出て右に曲がり、Springbootを見て、規則が構成よりも優れていることを理解し、コード行を記述せずにアプリケーションを実行できることを体験する必要があります。

ただし、初心者が直接SpringBootを見に行くことはお勧めできませんが、その理由は非常に簡単です。私たちは、フレームワークの使用方法に加えて、春を学びます。さらに、トップJavaプロジェクトとは何か、いわゆる仕様とは何か、デザインパターンとは何かを学ぶことも学びます。これらを理解できて初めて、本当の春を家で学ぶことができるようになります。

2020年5月13日

おすすめ

転載: blog.csdn.net/weixin_43907422/article/details/106068251