4-9 Spring Bean装配之Spring对JSR标准的支持
2026/7/28 14:39:09 网站建设 项目流程

@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中注册的

例子:

@RepositorypublicclassJsrDAO{publicvoidsave(){System.out.println("JsrDao.save");}}packagecom.torey.beanannotation.jsr;importorg.springframework.stereotype.Service;importjavax.annotation.PostConstruct;importjavax.annotation.PreDestroy;importjavax.annotation.Resource;/** * @ClassName:JsrServie * @Description: * @author: Torey */@ServicepublicclassJsrServie{// @Resource //这里也可以使用@AutowiredpublicJsrDAO jsrDAO;@ResourcepublicvoidsetJsrDAO(JsrDAO jsrDAO){this.jsrDAO=jsrDAO;}@PostConstructpublicvoidinit(){System.out.println("init初始化方法");}@PreDestroypublicvoiddetroy(){System.out.println("detroy销毁方法");}publicvoidsave(){jsrDAO.save();}}
@RunWith(BlockJUnit4ClassRunner.class)publicclassTestBeanAnnotationextendsUnitTestBase{publicTestBeanAnnotation(){super("classpath:spring-beanannotation.xml");}@TestpublicvoidtestSave(){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>
packagecom.torey.beanannotation.jsr;importorg.springframework.stereotype.Repository;/** * @ClassName:JsrDAO * @Description: * @author: Torey */@RepositorypublicclassJsrDAO{publicvoidsave(){System.out.println("JsrDao.save");}}
packagecom.torey.beanannotation.jsr;importjavax.annotation.PostConstruct;importjavax.annotation.PreDestroy;importjavax.inject.Inject;importjavax.inject.Named;/** * @ClassName:JsrServie * @Description: * @author: Torey *///@Service@NamedpublicclassJsrServie{// @Resource //这里也可以使用@AutowiredpublicJsrDAO jsrDAO;//Named("jsrDAO") 如果一个接口有两个实现类,则可以使用@Named// @Resource@InjectpublicvoidsetJsrDAO(@Named("jsrDAO")JsrDAO jsrDAO){this.jsrDAO=jsrDAO;}@PostConstructpublicvoidinit(){System.out.println("init初始化方法");}@PreDestroypublicvoiddetroy(){System.out.println("detroy销毁方法");}publicvoidsave(){jsrDAO.save();}}
packagecom.torey.springtest.base;importorg.junit.After;importorg.junit.Before;importorg.springframework.context.support.ClassPathXmlApplicationContext;importorg.springframework.util.StringUtils;/** * @ClassName:UnitTestBase * @Description: * @author: Torey */publicclassUnitTestBase{publicUnitTestBase(){}privateString springXmlPath;privateClassPathXmlApplicationContext applicationContext;publicUnitTestBase(String springXmlpath){this.springXmlPath=springXmlpath;}@Beforepublicvoidbefore(){if(StringUtils.isEmpty(springXmlPath)){springXmlPath="classpath*:spring-*.xml";}applicationContext=newClassPathXmlApplicationContext(springXmlPath.split("[,\\s]"));applicationContext.start();}@Afterpublicvoidafter(){applicationContext.destroy();}publicObjectgetBean(String beanId){returnapplicationContext.getBean(beanId);}}
packagecom.torey.springtest.bean;importcom.torey.beanannotation.jsr.JsrServie;importcom.torey.springtest.base.UnitTestBase;importorg.junit.Test;importorg.junit.runner.RunWith;importorg.junit.runners.BlockJUnit4ClassRunner;/** * @ClassName:TestResources * @Description: * @author: Torey */@RunWith(BlockJUnit4ClassRunner.class)publicclassTestBeanAnnotationextendsUnitTestBase{publicTestBeanAnnotation(){super("classpath:spring-beanannotation.xml");}@TestpublicvoidtestSave(){JsrServie jsrServie=(JsrServie)super.getBean("jsrServie");jsrServie.save();}}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询