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