4-9 Spring Bean裝配之Spring對JSR標準的支持

@Resource

  • Spring還支持使用JSR-250@Resource註解的變量或setter方法,這是一種在Java EE 5和6的通用模式,Spring管理的對象也支持這種模式
  • @Resource有一個name屬性,並且默認Spring解釋該值作爲被注入bean的名稱
    在這裏插入圖片描述
  • 如果沒有顯示地指定@Resource的name,默認的名稱是從屬性名或者setter方法得出
  • 註解提供的名字被解析爲一個bean的名稱,這是由ApplicationContext的中的CommonAnnotationBeanPostProcessor發現並處理的

@PostConstruct and @PreDestroy

  • CommonAnnotationBeanPostProcessor不僅能識別JSR-250中的生命週期@Resource,在Spring2.5中引入支持初始化回調和銷燬回調,前提是CommonAnnotationBeanPostProcessor是Spring的ApplicationContext中註冊的
    在這裏插入圖片描述

例子:

@Repository
public class JsrDAO {
    public void save(){
        System.out.println("JsrDao.save");
    }
}
package com.torey.beanannotation.jsr;

import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;

/**
 * @ClassName:JsrServie
 * @Description:
 * @author: Torey
 */
@Service
public class JsrServie {
  // @Resource  //這裏也可以使用@Autowired
    public JsrDAO jsrDAO;
    @Resource
    public void setJsrDAO(JsrDAO jsrDAO) {
        this.jsrDAO = jsrDAO;
    }
    @PostConstruct
    public void init(){
        System.out.println("init初始化方法");
    }
    @PreDestroy
    public void detroy(){
        System.out.println("detroy銷燬方法");
    }
    public void save(){
        jsrDAO.save();
    }
}

@RunWith(BlockJUnit4ClassRunner.class)
public class TestBeanAnnotation extends UnitTestBase {
    public TestBeanAnnotation(){
        super("classpath:spring-beanannotation.xml");
    }
    @Test
   public void testSave(){
       JsrServie jsrServie =(JsrServie) super.getBean("jsrServie");
       jsrServie.save();
   }
}

在這裏插入圖片描述

使用JSR330標準註解

  • 從Spring3.0開始支持JSR330標準註解(依賴注入註解),其掃描方式與Spring註解一致
  • 使用JSR330需要依賴javax.inject包
  • 使用Maven引入方式
  <dependency>
      <groupId>javax.inject</groupId>
      <artifactId>javax.inject</artifactId>
      <version>1</version>
    </dependency>

@Inject

  • @Inject等效於@Autowired,可以使用類、屬性、方法、構造器

@Named

  • 如果想使用特定名稱進行依賴注入,使用@Named
  • @Named與@Component是等效的

例子:

在這裏插入圖片描述
pom.xml

<dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.3.14.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>javax.inject</groupId>
      <artifactId>javax.inject</artifactId>
      <version>1</version>
    </dependency>
package com.torey.beanannotation.jsr;
import org.springframework.stereotype.Repository;
/**
 * @ClassName:JsrDAO
 * @Description:
 * @author: Torey
 */
@Repository
public class JsrDAO {
    public void save(){
        System.out.println("JsrDao.save");
    }
}

package com.torey.beanannotation.jsr;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.inject.Inject;
import javax.inject.Named;
/**
 * @ClassName:JsrServie
 * @Description:
 * @author: Torey
 */
//@Service
    @Named
public class JsrServie {
  // @Resource  //這裏也可以使用@Autowired
    public JsrDAO jsrDAO;
    //Named("jsrDAO") 如果一個接口有兩個實現類,則可以使用@Named
   // @Resource
    @Inject
    public void setJsrDAO(@Named("jsrDAO") JsrDAO jsrDAO) {
        this.jsrDAO = jsrDAO;
    }
    @PostConstruct
    public void init(){
        System.out.println("init初始化方法");
    }
    @PreDestroy
    public void detroy(){
        System.out.println("detroy銷燬方法");
    }
    public void save(){
        jsrDAO.save();
    }
}
package com.torey.springtest.base;

import org.junit.After;
import org.junit.Before;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.util.StringUtils;

/**
 * @ClassName:UnitTestBase
 * @Description:
 * @author: Torey
 */
public class UnitTestBase {
    public UnitTestBase(){}
    private String springXmlPath;
    private ClassPathXmlApplicationContext applicationContext;
    public UnitTestBase(String springXmlpath){
        this.springXmlPath=springXmlpath;
    }
    @Before
    public void before(){
        if (StringUtils.isEmpty(springXmlPath)) {
            springXmlPath="classpath*:spring-*.xml";
        }
        applicationContext= new ClassPathXmlApplicationContext(springXmlPath.split("[,\\s]"));
        applicationContext.start();
    }
    @After
   public void after(){
        applicationContext.destroy();
   }
   public Object getBean(String beanId){
       return applicationContext.getBean(beanId);
   }
}

package com.torey.springtest.bean;

import com.torey.beanannotation.jsr.JsrServie;
import com.torey.springtest.base.UnitTestBase;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;

/**
 * @ClassName:TestResources
 * @Description:
 * @author: Torey
 */
@RunWith(BlockJUnit4ClassRunner.class)
public class TestBeanAnnotation extends UnitTestBase {
    public TestBeanAnnotation(){
        super("classpath:spring-beanannotation.xml");
    }
    @Test
   public void testSave(){
       JsrServie jsrServie =(JsrServie) super.getBean("jsrServie");
       jsrServie.save();
   }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章