Spring 3とJSR-330 @Injectと@Namedの例

Spring 3およびJSR-330 @Injectおよび@Namedの例

Spring 3.0以降、Springは標準のJSR 330: Dependency Injection for Javaをサポートします。 Spring 3アプリケーションでは、標準を使用できます

  1. Beanを注入するためのSpringの@Autowiredの代わりに@Inject

  2. Beanを宣言するためのSpringの@Componentの代わりに@Named

これらのJSR-330標準アノテーションは、Springアノテーションと同じ方法でスキャンおよび取得されます。クラスパスに次のjarがある限り、統合は自動的に行われます。

pom.xml

    
        javax.inject
        javax.inject
        1
    

1. 春の注釈

通常のSpringのアノテーションの例を見てみましょう–@Autowired@Component

P.S @Component, @Repository and @Service are same, just declares a bean in Spring Ioc context.

CustomerDAO.java

package com.example.customer.dao;

import org.springframework.stereotype.Repository;

@Repository
public class CustomerDAO
{
    public void save() {
        System.out.println("CustomerDAO save method...");
    }
}

CustomerService.java

package com.example.customer.services;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.example.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.example.customer.dao;

import javax.inject.Named;

@Named
public class CustomerDAO
{

    public void save() {
        System.out.println("CustomerDAO save method...");
    }
}

CustomerService.java

package com.example.customer.services;

import javax.inject.Inject;
import javax.inject.Named;

import com.example.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 – Scan bean automatically



    

App.java – Run it

package com.example;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.example.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にはいくつかの制限があります。

  1. @Injectには、Beanが正常に注入されることを確認するための「required」属性がありません。

  2. Springコンテナでは、JSR-330のスコープはデフォルトでシングルトンですが、Springの@Scopeを使用して他を定義できます。

  3. 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)