@resources注解
@Resource 注解被⽤来激活⼀个命名资源(namedresource)的依赖注⼊,在JavaEE应⽤程序中,该注解被典型地转换为绑定于JNDI context中的⼀个对象。Spring确实⽀持使⽤@Resource通过JNDIlookup来解析对象,默认地,拥有与@Resource注解所提供名字相匹配的“beanname(bean名字)”的Spring管理对象会被注⼊。在下⾯的例⼦中,Spring会向加了注解的setter⽅法传递bean名
为“dataSource”的Spring管理对象的引⽤。
@Resource(name="dataSource")
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
直接使⽤@Resource注解⼀个域(field)同样是可能的。通过不暴露setter⽅法,代码愈发紧凑并且还提供了域不可修改的额外益处。正如下⾯将要证明的,@Resource注解甚⾄不需要⼀个显式的字符串值,在没有提供任何值的情况下,域名将被当作默认值。
@Resource
private DataSource dataSource; // inject the bean named 'dataSource'
该⽅式被应⽤到setter⽅法的时候,默认名是从相应的属性衍⽣出来,换句话说,命名为'setDataSource'的⽅法被⽤来处理名
为'dataSource'的属性。
private DataSource dataSource;
@Resource
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
当@Resource没有显式提供名字的时候,如果根据默认名字不到对应的Spring管理对象,注⼊机制会回滚⾄类型匹配(type-match)。如果刚好只有⼀个Spring管理对象符合该依赖的类型,那么它会
被注⼊。通过设置CommonAnnotationBeanPostProcessor 的‘fallbackToDefaultTypeMatch’属性为“false”(默认值是“true”)可以禁⽤这⼀特性。
<bean class="t.annotation.CommonAnnotationBeanPostProcessor">
<property name="fallbackToDefaultTypeMatch"value="false"/>
</bean>
正如上⽂所提到的,在解析标有@Resource注解的依赖时,Spring⽀持JNDI-lookup。如若要强制对所有使⽤@Resource注解的依赖进⾏JNDIlookup,那也只要将CommonAnnotationBeanPostProcessor的'alwaysUseJndiLookup'标识设置为true就可以了(默认值是false)。
<bean class="t.annotation.CommonAnnotationBeanPostProcessor">
<property name="alwaysUseJndiLookup"value="true"/>
</bean>
另⼀个选择是,激活指定为‘resource-ref-mappings’的依据全局JNDI名的查,在@Resource注解内提供‘mappedName’属性。即使⽬标对象实际上是⼀个JNDI资源,仍然推荐引⼊⼀个Spring管理对象,这样可以提供⼀个间接层并且因此降低耦合程度。⾃
Spring2.0开始添加命名空间以来,定义⼀个委托Spring处理JNDIlookup的bean也变得愈发简练:
<jee:jndi-lookup id="dataSource"jndi-name="java:comp/env/jdbc/petclinic"/>
这个⽅法的优点在于间接层带来了巨⼤的部署弹性。⽐如说,⼀个单独的系统测试环境应该不再需要JNDI注册。在这种情况下,在系统测试配置中可以提供如下的bean定义:
<bean id="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.url}"
p:username="${jdbc.username}"
p:password="${jdbc.password}"/>
顺便提⼀下,上⾯的例⼦中,实际的JDBC连接属性从⼀个属性⽂件(propertiesfile)解析⽽来,在这个属性⽂件⾥,关键字与提供的${占位符}互相对应,这需要注册⼀个名为PropertyPlaceholderConfigurer的BeanFactoryPostProcessor实现来完成。这是具体化那些属性(通常是针对特定环境的属性)常⽤的技术,这些属性可能⽐其他配置修改得更为频繁。
<bean class="org.springframework.fig.PropertyPlaceholderConfigurer">
<property name="location"value="classpath:jdbc.properties"/>
resource和autowired注解的区别</bean>
Srping2.5中新加⼊了‘context’命名空间,这个命名空间让我们能够得到更为简洁的⽅式来实现属性占位符(propertyplaceholder)的配置:
<context:property-placeholder location="classpath:jdbc.properties"/>、
@service("")注解是⼲什么⽤的
如在⼀个Student实现类上加上@Service("student"),括号⾥⾯就是给实例化后的Student对象取个名字。。。
这是在你⼀个接⼝有多个实现类的情况下区分实现类的⽅式。。。。
⽐如Student实现了Person接⼝,在你的controller⾥⾯@Autowired Person时,假如这时Person还有另⼀个实现类User,为了确定实例化Student还是User, @Service括号⾥⾯的东西就有⽤了,
@Autowired
@Qualifier("student")
private Person person;
这样就确定实例化了⼀个Person指向⼀个Student对象。。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论