ウェブサイト検索

春の注釈


Spring Annotationsを使用すると、依存関係を構成し、Javaプログラムを通じて依存性注入を実装することができます。

春の注釈

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

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

春のアノテーションリスト

Springコアフレームワークのアノテーションのいくつかは次のとおりです:

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

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

    • 名前 - ビーンに名前を付けることができます
    • 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("Load operating system");
        }
    
        @PreDestroy
        public void turnOff(){
            System.out.println("Close all programs");
        }
    }
    
  4. @ComponentScan: @Configuration クラスで使用するコンポーネントスキャンの指示を設定します。ここでは、Spring コンポーネントをスキャンするためのベースパッケージを指定できます。

  5. @Component: アノテーションが付けられたクラスが「コンポーネント」であることを示します。このようなクラスは、アノテーションベースの設定およびクラスパススキャンを使用する際に、自動検出の候補と見なされます。

  6. @PropertySource: Spring の Environment にプロパティソースを追加するための簡単な宣言メカニズムを提供します。同様のアノテーションとして、複数のプロパティソースファイルを追加するための @PropertySources があります。

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

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

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

Spring MVC アノテーション

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

  1. @コントローラー
  2. @RequestMapping
  3. @PathVariable
  4. @RequestParam
  5. @ModelAttribute
  6. @RequestBody と @ResponseBody
  7. @RequestHeader と @ResponseHeader

Spring MVC チュートリアルで彼らについてもっと学ぶことができます。

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

@Transactional はSpringの宣言的トランザクション管理アノテーションです。詳細はSpring MVC Hibernateをご覧ください。

Spring Security アノテーション

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

Spring Boot アノテーション

  1. @SpringBootApplication
  2. @EnableAutoConfiguration

Spring Bootの例についてもっと読む。

春のアノテーションの例

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

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

私はMavenプロジェクトを作成し、Spring Core Frameworkの依存関係を追加しました。

<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>

これにより、私たちのプロジェクト用のすべての春のコアJARファイルが表示されます。

コンポーネントクラス

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

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 +
                " ]";
    }
}

@Component アノテーションを使用して、このクラスをコンポーネントとして扱うように Spring フレームワークに指示することに注意してください。また、@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はシンプルなビーンであり、プロパティをこのビーンに注入するためにサービスクラスを使用します。

春のサービスクラス

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();
    }
}

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

スプリングビーン

最後のステップは、すべてをまとめるために春のBeanと構成クラスを作成することです。

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

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

私たちの春の注釈のサンプルプロジェクトはテストの準備が整いました。概要として、次のステップを実行しました:

  1. Mavenプロジェクトを作成し、必要なSpring依存関係を追加しました。
  2. コンポーネントクラスを作成し、リソースファイルからその変数にプロパティを注入しました。
  3. 第三者コンポーネントがある場合、Serviceクラスを使用して依存関係を注入できます。これは、UserServiceクラスを通じてOracleDriverに対して行ったことと同じです。
  4. 最終的に、私たちは Configuration クラスを作成して、Spring Beans を定義し、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フレームワークのログが赤色でコンソールに出力されていることに注意してください。

スプリングアノテーションのサンプルプロジェクトをダウンロード

参照:APIドキュメント

関連記事: