Spring Annotations

Springのアノテーションを使用すると、Javaプログラムを介して依存関係を設定し、依存関係の注入を実装できます。

Springアノテーション

  • Springフレームワークは制御の反転(IoC)または依存性の注入(DI)の原則を実装し、実際にIoCコンテナです。
  • 従来、SpringはXMLベースの構成を使用してビーンの依存関係を管理することを開発者に許可していました。
  • ビーンとその依存関係を定義する代替方法があります。この方法は、Javaベースの構成です。
  • XMLアプローチとは異なり、Javaベースの構成ではビーンコンポーネントをプログラムで管理できます。そのため、Springアノテーションが導入されました。

この記事では、最も一般的に使用されるSpringアノテーションを探求し、いくつかの例プログラムも見ていきます。

Springアノテーションリスト

Springコアフレームワークの一部のアノテーションは次のとおりです:

  1. @Configuration:1つ以上の@Beanメソッドを宣言するクラスを示すために使用されます。これらのクラスは、Springコンテナによってランタイムでビーンの定義とそれらのビーンへのサービスリクエストが生成されます。

  2. @Bean: メソッドがSpringコンテナによって管理されるビーンを生成することを示します。これは最も使用され、重要なSpringアノテーションの1つです。@Beanアノテーションは、name、initMethod、destroyMethodなどのパラメータとともに使用することもできます。

    • name – ビーンに名前を付けることができます
    • initMethod – コンテキスト登録時に呼び出されるメソッドを選択できます
    • destroyMethod – コンテキストのシャットダウン時に呼び出されるメソッドを選択できます

    例:

    @Configuration
    public class AppConfig {
    
        @Bean(name = "comp", initMethod = "turnOn", destroyMethod = "turnOff")
        Computer computer(){
            return new Computer();
        }
    }
    
    public class Computer {
    
        public void turnOn(){
            System.out.println("Load operating system");
        }
        public void turnOff(){
            System.out.println("Close all programs");
        }
    }
    
  3. @PreDestroy@PostConstructは、beanのinitMethodとdestroyMethodの代替手段です。これは、beanクラスが自分たちで定義されている場合に使用できます。例:

     public class Computer {
    
        @PostConstruct
        public void turnOn(){
            System.out.println("オペレーティングシステムをロードします");
        }
    
        @PreDestroy
        public void turnOff(){
            System.out.println("すべてのプログラムを閉じます");
        }
    }
    
  4. @ComponentScan@Configurationクラスと共に使用するためのコンポーネントスキャンの指示を設定します。ここでは、スプリングコンポーネントをスキャンする基本パッケージを指定できます。

  5. @Component: アノテーションベースの構成とクラスパススキャンを使用する場合に、アノテーションで注釈付けされたクラスが「コンポーネント」であることを示します。このようなクラスは、自動検出の候補として考慮されます。

  6. @PropertySource:Springの環境にプロパティソースを追加するためのシンプルな宣言メカニズムを提供します。プロパティソースファイルの配列を追加するための類似の注釈もあります、すなわち@PropertySources

  7. @Service:アノテーション付きのクラスが「サービス」であることを示します。この注釈は、@Componentの特殊化として機能し、実装クラスがクラスパススキャンを介して自動検出されるようにします。

  8. @Repository:アノテーション付きのクラスが「リポジトリ」であることを示します。この注釈は、@Componentの特殊化であり、DAOクラスと共に使用することが推奨されます。

  9. @Autowired: Springの@Autowired注釈は、ビーンの自動インジェクションに使用されます。Springの@Qualifier注釈は、同じタイプのビーンが2つ以上構成されている場合の混乱を避けるために@Autowiredと共に使用されます。

Spring MVCのアノテーション

重要なSpring MVCのアノテーションのいくつかは次のとおりです:

  1. @Controller
  2. @RequestMapping
  3. @PathVariable
  4. @RequestParam
  5. @ModelAttribute
  6. @RequestBody@ResponseBody
  7. @RequestHeader@ResponseHeader

これらについては、Spring MVCチュートリアルで詳しく学ぶことができます。

Springトランザクション管理アノテーション

@Transactionalは、Springの宣言的トランザクション管理アノテーションです。詳細については、Spring MVC Hibernateを参照してください。

Springセキュリティアノテーション

@EnableWebSecurityは、@Configurationクラスと共に使用され、Spring Securityの設定を定義します。詳細については、Spring Securityの例を参照してください。

Spring Bootのアノテーション

  1. @SpringBootApplication
  2. @EnableAutoConfiguration

詳細については、Spring Bootの例を参照してください。

Springのアノテーションの例

Springアノテーションをアプリケーションで使用するシンプルな例を見てみましょう。以下の画像は、私のSpringアノテーションの例プロジェクトを示しています。

Springフレームワークの依存関係

I have created the maven project and added Spring Core Framework dependencies.

<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.journaldev.spring</groupId>
	<artifactId>spring-annotations</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>Spring Annotations</name>

	<properties>
		<spring.framework>4.3.0.RELEASE</spring.framework>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.framework}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.framework}</version>
		</dependency>

	</dependencies>

</project>

これにより、プロジェクトのためのすべてのSpringコアJARが取得されます。

コンポーネントクラス

次のステップは、コンポーネントクラスを作成することです。ここでは、複数のデータベースコンポーネントを模倣しています。MySQL用とOracle用の2つがあります。

package com.journaldev.drivers;

public interface DataBaseDriver {
    public String getInfo();
}

DataBaseDriverは実装する基本のインターフェースです。

package com.journaldev.drivers;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

@Component
@PropertySource("classpath:mysqldatabase.properties")
public class MySqlDriver implements DataBaseDriver {

    @Value("${databaseName}")
    private String databaseName;
    @Value("${disableStatementPooling}")
    private String disableStatementPooling;

    public String getInfo() {
        return "[ Driver: mySql" +
                ", databaseName: " + databaseName +
                ", disableStatementPooling: " + disableStatementPooling +
                " ]";
    }
}

このクラスをコンポーネントとして扱うようにSpringフレームワークに示すために、@Component注釈が使用されています。また、@PropertySourceおよび@Value注釈が使用されています。Springは、指定されたプロパティファイルからこれらの変数の値を実行時に注入および設定します。以下はmysqldatabase.propertiesファイルで宣言されたプロパティです。

databaseName=school
disableStatementPooling=true
package com.journaldev.drivers;

public class OracleDriver implements DataBaseDriver {

    protected String url;
    protected String user;
    protected String password;
    protected String driver;
    protected Integer port;


    public String getUrl() {
        return url;
    }

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getDriver() {
        return driver;
    }

    public void setDriver(String driver) {
        this.driver = driver;
    }

    public Integer getPort() {
        return port;
    }

    public void setPort(Integer port) {
        this.port = port;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getInfo() {
        return "[ Driver: Oracle" +
                ", url: " + url +
                ", port; " + port +
                ", user: " + user +
                ", password: " + password  +
                ", driver: " + driver +
                " ] ";
    }
}

OracleDriverはシンプルなビーンです。このビーンにプロパティを注入するためにサービスクラスを使用します。

Springサービスクラス

package com.journaldev.service;

import com.journaldev.drivers.DataBaseDriver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Autowired
    @Qualifier("oracleDriver")
    private DataBaseDriver dataBaseDriver;

    public String getDriverInfo(){
        return dataBaseDriver.getInfo();
    }
}

ここでは、Springフレームワークにこれをサービスクラスとして扱うように示すために@Service注釈を使用しています。次に、@Autowiredおよび@Qualifier("oracleDriver")注釈を使用して、SpringフレームワークにoracleDriverという名前のビーンをdataBaseDriverクラスプロパティに注入するように指示します。まだこのSpringビーンを作成していないことに注意してください。

Springビーン

最後のステップは、Springビーンと構成クラスを作成し、すべてを結びつけることです。

package com.journaldev.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;

import com.journaldev.drivers.DataBaseDriver;
import com.journaldev.drivers.MySqlDriver;
import com.journaldev.drivers.OracleDriver;

@Configuration
@ComponentScan("com.journaldev")
@PropertySource("classpath:oracledatabase.properties")
public class AppConfig {

	@Autowired
        Environment environment;
	
	@Bean
	DataBaseDriver oracleDriver() {
        OracleDriver oracleDriver = new OracleDriver();
	oracleDriver.setDriver(environment.getProperty("db.driver"));
        oracleDriver.setUrl(environment.getProperty("db.url"));
        oracleDriver.setPort(Integer.parseInt(environment.getProperty("db.port")));
        oracleDriver.setUser(environment.getProperty("db.user"));
        oracleDriver.setPassword(environment.getProperty("db.password"));

        return oracleDriver;

	}

	@Bean
	DataBaseDriver mysqlDriver() {
		return new MySqlDriver();
	}
}

oracleDriverのビーン定義に注目してください。このメソッドでは、Springフレームワークによってenvironment変数に設定されるoracledatabase.propertiesファイルからプロパティを読み取ります。以下はoracledatabase.propertiesファイルで定義されたプロパティです。

db.url=localhost
db.port=4444
db.user=vasiliy
db.password=yilisav
db.driver=driver_name

当社のSpring注釈の例題プロジェクトはテストの準備ができました。要約すると、以下の手順を実行しました:

  1. Mavenプロジェクトを作成し、必要なSpring依存関係を追加しました。
  2. コンポーネントクラスを作成し、リソースファイルからプロパティを注入してその変数に設定しました。
  3. サードパーティーのコンポーネントがある場合、Serviceクラスを使用して依存関係をそれに注入できます。OracleDriverをUserServiceクラスを介して行ったのと同じように。
  4. 最後に、Spring Beansを定義し、Springコンポーネントクラスをスキャンして構成する基本パッケージを設定するConfigurationクラスを作成しました。

Spring注釈の例題テスト

以下は、Spring注釈の例題プロジェクトをテストするためのメインクラスです。

package com.journaldev;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;

import com.journaldev.config.AppConfig;
import com.journaldev.drivers.DataBaseDriver;
import com.journaldev.service.UserService;

public class Main {
	public static void main(String[] args) {
	AbstractApplicationContext appContext = new AnnotationConfigApplicationContext(AppConfig.class);

	DataBaseDriver oracle = appContext.getBean("oracleDriver", DataBaseDriver.class);
	DataBaseDriver mysql = appContext.getBean("mysqlDriver", DataBaseDriver.class);
		
        System.out.println("Oracle driver info:");
        System.out.println(oracle.getInfo());
        
        System.out.println("MySQL driver info:");
        System.out.println(mysql.getInfo());

        System.out.println("UserService Information");
	UserService userService = appContext.getBean(UserService.class);
	System.out.println(userService.getDriverInfo());

	appContext.close();
	}
}

以下の画像は、生成された出力を示しています。ログフレームワークを構成していないことに注意してください。そのため、すべてのSpringフレームワークのログが赤色でコンソールに出力されています。 これで、Spring注釈の簡単な紹介が終わりました。ここには重要な注釈のほとんどをリストアップしましたが、特定のタスク用のさらに多くの注釈があります。Spring注釈の例題プロジェクトは、以下のリンクからダウンロードできます。

Spring注釈の例プロジェクトをダウンロード

参照: APIドキュメント

Source:
https://www.digitalocean.com/community/tutorials/spring-annotations