スプリングのアノテーション
Springのアノテーションは、Javaプログラムを介して依存関係を設定し、依存性の注入を実装することができます。
スプリングの注釈
- Spring framework implements and promotes the principle of control inversion (IOC) or dependency injection (DI) and is in fact an IOC container.
- Traditionally, Spring allows a developer to manage bean dependencies by using XML-based configuration.
- There is an alternative way to define beans and their dependencies. This method is a Java-based configuration.
- Unlike the XML approach, Java-based configuration allows you to manage bean components programmatically. That’s why Spring annotations were introduced.
この記事では、最も一般的に使用されるSpringのアノテーションと、いくつかのプログラム例について探求します。
「Springアノテーションのリスト」
いくつかのSpringコアフレームワークのアノテーションは次の通りです。
-
- @Configuration:クラスが1つ以上の@Beanメソッドを宣言することを示すために使用されます。これらのクラスは、Springコンテナによって処理され、実行時にそれらのビーンの定義とサービスリクエストが生成されます。
@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(“オペレーティングシステムをロードします”);
}
public void turnOff(){
System.out.println(“すべてのプログラムを終了します”);
}
}
@PreDestroyと@PostConstructは、beanのinitMethodとdestroyMethodの代替手段です。これは、beanクラスが自分で定義されている場合に使用することができます。例:
public class Computer {
@PostConstruct
public void turnOn(){
System.out.println(“オペレーティングシステムをロードします”);
}
@PreDestroy
public void turnOff(){
System.out.println(“すべてのプログラムを終了します”);
}
}
@ComponentScan:Springコンポーネント用のベースパッケージを指定するためのコンポーネントスキャンの指令を構成します。
@Component:注釈付きクラスが「コンポーネント」であることを示します。このようなクラスは、注釈ベースの構成とクラスパスのスキャン時に自動検出の候補として考慮されます。
@PropertySource:SpringのEnvironmentにプロパティソースを追加するための簡単な宣言メカニズムを提供します。プロパティソースファイルの配列を追加するための類似のアノテーションもあります、つまり@PropertySources。
@Service:注釈付きクラスが「サービス」であることを示します。このアノテーションは、@Componentの特殊化として機能し、クラスパスのスキャンを介して実装クラスが自動検出されるようにします。
@Repository:注釈付きクラスが「リポジトリ」であることを示します。このアノテーションは、@Componentの特殊化であり、DAOクラスと一緒に使用することを推奨します。
@Autowired:Springの@Autowiredアノテーションは、ビーンの自動インジェクションに使用されます。Springの@Qualifierアノテーションは、同じタイプの2つ以上のビーンが構成されている場合に混乱を避けるために@Autowiredと一緒に使用されます。
Spring MVCのアノテーションをパラフレーズしてください。
重要なSpring MVCのアノテーションの一部は次のとおりです。
-
- @Controller
-
- @RequestMapping
-
- @PathVariable
-
- @RequestParam
-
- @ModelAttribute
-
- @RequestBody と @ResponseBody
- @RequestHeader と @ResponseHeader
「Spring MVC チュートリアルで、それについてより詳しく知ることができます。」
スプリングのトランザクション管理アノテーション
@Transactionalは、Springの宣言的トランザクション管理アノテーションであり、Spring MVC Hibernateで詳細を読むことができます。
Spring Securityのアノテーション
@Configurationクラスと一緒に@EnableWebSecurityを使用すると、Spring Securityの設定が定義されます。Spring Securityの例を詳しくはSpring Security Exampleで読むことができます。
スプリングブートのアノテーション
- @SpringBootApplicationと@EnableAutoConfiguration
「Spring Boot Example」の記事をもっと読む。
Springアノテーションの例
Spring Frameworkの依存関係
私は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.scdev.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 Coreのjarファイルが表示されます。
コンポーネントクラス (Konpōnento kurasu)
次のステップは、コンポーネントクラスを作成することです。ここでは、MySQL用の1つとOracle用の別のデータベースコンポーネントを模倣しています。
package com.scdev.drivers;
public interface DataBaseDriver {
public String getInfo();
}
DataBaseDriverは私たちが実装する基本インターフェースです。
package com.scdev.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.scdev.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.scdev.service;
import com.scdev.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フレームワークにoracleDriverという名前のビーンをクラスプロパティdataBaseDriverに注入するように指示しています。なお、まだこのspringビーンを作成していません。
スプリングのビーン
最終的なステップは、すべてを結び付けるために私たちのスプリングビーンと設定クラスを作成することです。
package com.scdev.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.scdev.drivers.DataBaseDriver;
import com.scdev.drivers.MySqlDriver;
import com.scdev.drivers.OracleDriver;
@Configuration
@ComponentScan("com.scdev")
@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フレームワークによって環境変数に設定されたoracledatabase.propertiesファイルからプロパティを読み取っています。以下は、oracledatabase.propertiesファイルで定義されたプロパティです。
db.url=localhost
db.port=4444
db.user=vasiliy
db.password=yilisav
db.driver=driver_name
私たちのSpringの注釈のサンプルプロジェクトは、テストする準備ができています。要約すると、以下の手順を実行しました。
-
- Mavenプロジェクトを作成し、必要なSpringの依存関係を追加しました。
-
- コンポーネントクラスを作成し、リソースファイルからプロパティを変数に注入しました。
-
- もしサードパーティーのコンポーネントがあれば、Serviceクラスを使用してそれに依存関係を注入することができます。まさに私たちがOracleDriverをUserServiceクラスを通じて行ったように。
- 最後に、Configurationクラスを作成してSpringのビーンを定義し、Springコンポーネントクラスをスキャンして設定するためのベースパッケージを設定しました。
春のアノテーションの例によるテスト
私たちのSpringアノテーションの例のプロジェクトをテストするためのメインクラスです。
package com.scdev;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import com.scdev.config.AppConfig;
import com.scdev.drivers.DataBaseDriver;
import com.scdev.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のドキュメント