4-9 Spring Bean装配之Spring对JSR标准的支持
ResourceSpring还支持使用JSR-250Resource注解的变量或setter方法这是一种在Java EE 5和6的通用模式Spring管理的对象也支持这种模式Resource有一个name属性并且默认Spring解释该值作为被注入bean的名称如果没有显示地指定Resource的name,默认的名称是从属性名或者setter方法得出注解提供的名字被解析为一个bean的名称这是由ApplicationContext的中的CommonAnnotationBeanPostProcessor发现并处理的PostConstruct and PreDestroyCommonAnnotationBeanPostProcessor不仅能识别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;/** * ClassNameJsrServie * Description * author: Torey */ServicepublicclassJsrServie{// Resource //这里也可以使用AutowiredpublicJsrDAO jsrDAO;ResourcepublicvoidsetJsrDAO(JsrDAO jsrDAO){this.jsrDAOjsrDAO;}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引入方式dependencygroupIdjavax.inject/groupIdartifactIdjavax.inject/artifactIdversion1/version/dependencyInjectInject等效于Autowired,可以使用类、属性、方法、构造器Named如果想使用特定名称进行依赖注入使用NamedNamed与Component是等效的例子pom.xmldependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/versionscopetest/scope/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion4.3.14.RELEASE/version/dependencydependencygroupIdjavax.inject/groupIdartifactIdjavax.inject/artifactIdversion1/version/dependencypackagecom.torey.beanannotation.jsr;importorg.springframework.stereotype.Repository;/** * ClassNameJsrDAO * 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;/** * ClassNameJsrServie * Description * author: Torey *///ServiceNamedpublicclassJsrServie{// Resource //这里也可以使用AutowiredpublicJsrDAO jsrDAO;//Named(jsrDAO) 如果一个接口有两个实现类则可以使用Named// ResourceInjectpublicvoidsetJsrDAO(Named(jsrDAO)JsrDAO jsrDAO){this.jsrDAOjsrDAO;}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;/** * ClassNameUnitTestBase * Description * author: Torey */publicclassUnitTestBase{publicUnitTestBase(){}privateString springXmlPath;privateClassPathXmlApplicationContext applicationContext;publicUnitTestBase(String springXmlpath){this.springXmlPathspringXmlpath;}Beforepublicvoidbefore(){if(StringUtils.isEmpty(springXmlPath)){springXmlPathclasspath*:spring-*.xml;}applicationContextnewClassPathXmlApplicationContext(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;/** * ClassNameTestResources * Description * author: Torey */RunWith(BlockJUnit4ClassRunner.class)publicclassTestBeanAnnotationextendsUnitTestBase{publicTestBeanAnnotation(){super(classpath:spring-beanannotation.xml);}TestpublicvoidtestSave(){JsrServie jsrServie(JsrServie)super.getBean(jsrServie);jsrServie.save();}}