5. public @interface CustomQualifier {
6. String value();
7. }
package cn.javass.spring.chapter12.qualifier;
//省略import
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomQualifier {
String value();
}
2、准备测试Bean:
Java代码
1. package cn.javass.spring.chapter12;
2. //省略import
3. public class TestBean35 {
4. private DataSource dataSoruce;
5. @Autowired
6. public TestBean35(@CustomQualifier("oracleDataSource") DataSource dataSource) {
7. this.dataSoruce = dataSource;
8. }
9. public DataSource getDataSoruce() {
10. return dataSoruce;
11. }
12. }
package cn.javass.spring.chapter12;
//省略import
public class TestBean35 {
private DataSource dataSoruce;
@Autowired
public TestBean35(@CustomQualifier("oracleDataSource") DataSource dataSource) {
this.dataSoruce = dataSource;
}
public DataSource getDataSoruce() {
return dataSoruce;
}
}
3、在Spring配置文件(chapter12/dependecyInjectWithAnnotation.xml)添加如下Bean配置:
Java代码
1.
4、然后在Spring配置文件中注册CustomQualifier自定义注解限定描述符,只有注册了Spring才能识别:
Java代码
1.
2.
3.
4.
5.
6.
7.
5、测试方法如下:
Java代码
1. @Test
2. public void testQualifierInject5() {
4. Assert.assertEquals(ctx.getBean("oracleDataSource"), testBean35.getDataSource());
5. }
@Test
public void testQualifierInject5() {
TestBean35 testBean35 = ctx.getBean("testBean35", TestBean35.class);
Assert.assertEquals(ctx.getBean("oracleDataSource"), testBean35.getDataSource());
}
从测试中可看出,自定义的和Spring自带的没什么区别,因此如果没有足够的理由请使用Spring自带的Qualifier注解。
到此限定描述符介绍完毕,在此一定要注意以下几点:
限定标识符和Bean的描述符是不一样的;
多个Bean定义中可以使用相同的限定标识符;
对于集合、数组、字典类型的限定描述符注入,将注入多个具有相同限定标识符的Bean。
12.2.3 JSR-250注解
一、@Resource:自动装配,默认根据类型装配,如果指定name属性将根据名字装配,可以使用如下方式来指定:
Java代码
1. @Resource(name = "标识符")
2. 字段或setter方法
@Resource(name = "标识符")
字段或setter方法
1、准备测试Bean:
Java代码
1. package cn.javass.spring.chapter12;
2. import javax.annotation.Resource;
3. public class TestBean41 {
4. @Resource(name = "message")
5. private String message;
6. //省略getter和setter
7. }
package cn.javass.spring.chapter12;
import javax.annotation.Resource;
public class TestBean41 {
@Resource(name = "message")
private String message;
//省略getter和setter
}
2、在Spring配置文件(chapter12/dependecyInjectWithAnnotation.xml)添加如下Bean配置:
Java代码
1.
3、测试方法如下:
Java代码
1. @Test
2. public void testResourceInject1() {
3. TestBean41 testBean41 = ctx.getBean("testBean41", TestBean41.class);
4. Assert.assertEquals("hello", testBean41.getMessage());
5. }
@Test
public void testResourceInject1() {
TestBean41 testBean41 = ctx.getBean("testBean41", TestBean41.class);
Assert.assertEquals("hello", testBean41.getMessage());
}
使用非常简单,和@Autowired不同的是可以指定name来根据名字注入。
使用@Resource需要注意以下几点:
@Resource注解应该只用于setter方法注入,不能提供如@Auto