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