Spring 3とJSR-330 @Injectと@Namedの例
Spring 3.0以降、Springは標準のhttp://www.jcp.org/ja/jsr/detail?id=330[JSR 330:Javaの依存性注入]をサポートしています。 Spring 3アプリケーションでは、標準
-
Beanを挿入するためにSpringの
@ Autowired`の代わりに
@Inject`を使います. -
Beanを宣言するには、Springの
@Component`の代わりに
@ Named`を使います.
これらのJSR-330標準アノテーションは、Springアノテーションと同じ方法でスキャンされ、取得されます。統合はクラスパスの次のjarである限り、自動的に行われました。
pom.xml
<dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency>
1.春の注釈
通常のSpringの注釈の例を見てみましょう –
@ Autowired`と
@ Component`
__P.S
@ Component
、` @ Repository`と `@Service`は同じですが、Spring IocコンテキストでBeanを宣言するだけです。
CustomerDAO.java
package com.mkyong.customer.dao; import org.springframework.stereotype.Repository; @Repository public class CustomerDAO { public void save() { System.out.println("CustomerDAO save method..."); } }
CustomerService.java
package com.mkyong.customer.services; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.mkyong.customer.dao.CustomerDAO; @Service public class CustomerService { @Autowired CustomerDAO customerDAO; public void save() { System.out.println("CustomerService save method..."); customerDAO.save(); } }
2. JSR-330注釈
基本的には、
@ Inject`と
@ Named`という別々のアノテーションを使って同じように動作します。
CustomerDAO.java
package com.mkyong.customer.dao; import javax.inject.Named; @Named public class CustomerDAO { public void save() { System.out.println("CustomerDAO save method..."); } }
CustomerService.java
package com.mkyong.customer.services; import javax.inject.Inject; import javax.inject.Named; import com.mkyong.customer.dao.CustomerDAO; @Named public class CustomerService { @Inject CustomerDAO customerDAO; public void save() { System.out.println("CustomerService save method..."); customerDAO.save(); } }
3.それを実行する
SpringとJSR330アノテーションの両方で、コンポーネントのスキャンが必要です。
Spring-AutoScan.xml – 自動的にBeanをスキャンする
<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 http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> <context:component-scan base-package="com.mkyong.customer"/> </beans>
App.java – それを実行する
package com.mkyong; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.mkyong.customer.services.CustomerService; public class App { public static void main( String[]args ) { ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"Spring-AutoScan.xml"}); CustomerService cust = (CustomerService)context.getBean("customerService"); cust.save(); } }
上記の2つの例は同じ出力を生成します
CustomerService save method... CustomerDAO save method...
4. JSR-330の制限事項
Springと比較すると、JSR-330にはいくつかの制限があります。
-
`@Inject`には、Beanが存在することを確認するための”
required
“属性はありません
成功した。
-
Springコンテナでは、デフォルトでJSR-330にスコープシングルトンが設定されていますが、
Springの `@Scope`を使って他のものを定義することができます。
-
Springの
@Value
、` @ Required`、 `@Lazy`に相当するものはありません.
Spring references
をご覧ください。
5.JSR-330に行く
実際、Springのアノテーションはより強力ですが、Springフレームワークでのみ利用可能です。 JSR-330は標準仕様であり、JSR-330仕様に準拠するすべてのJ2EE環境でサポートされています。
新規プロジェクトやマイグレーションプロジェクトの場合は、JSR-330アノテーションを使用することを常にお勧めします。忘れずに、Spring 3でも機能します。
ソースコードをダウンロードする
ダウンロードする –
Spring-JSR330-Example.zip
(27kb)