11. }
12. Assert.assertEquals(ctx.getBean("mysqlDataSourceBean"), testBean31.getDataSource());
13. }
@Test
public void testQualifierInject1() {
TestBean31 testBean31 = ctx.getBean("testBean31", TestBean31.class);
try {
//使用
ctx.getBean("mysqlDataSource");
Assert.fail();
} catch (Exception e) {
//找不到该Bean
Assert.assertTrue(e instanceof NoSuchBeanDefinitionException);
}
Assert.assertEquals(ctx.getBean("mysqlDataSourceBean"), testBean31.getDataSource());
}
从测试可以看出使用
(2)、缺省的根据Bean名字注入:最基本方式,是在Bean上没有指定
1、准备测试Bean:
Java代码
1. package cn.javass.spring.chapter12;
2. //省略import
3. public class TestBean32 {
4. private DataSource dataSource;
5. @Autowired
6. @Qualifier(value = "mysqlDataSource2") //指定Bean限定标识符
7. //@Qualifier(value = "mysqlDataSourceBean")
8. //是错误的注入,不会发生回退容错,因为你指定了
9. public void initDataSource(DataSource dataSource) {
10. this.dataSource = dataSource;
11. }
12. public DataSource getDataSource() {
13. return dataSource;
14. }
15. }
16.
package cn.javass.spring.chapter12;
//省略import
public class TestBean32 {
private DataSource dataSource;
@Autowired
@Qualifier(value = "mysqlDataSource2") //指定Bean限定标识符
//@Qualifier(value = "mysqlDataSourceBean")
//是错误的注入,不会发生回退容错,因为你指定了
public void initDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
public DataSource getDataSource() {
return dataSource;
}
}
2、在Spring配置文件(chapter12/dependecyInjectWithAnnotation.xml)添加如下Bean配置:
Java代码
1.
2.
3、测试方法如下:
Java代码
1. @Test
2. public void testQualifierInject2() {
3. TestBean32 testBean32 = ctx.getBean("testBean32", TestBean32.class);
4. Assert.assertEquals(ctx.getBean("oracleDataSource"), testBean32.getDataSource());
5. }
@Test
public void testQualifierInject2() {
TestBean32 testBean32 = ctx.getBean("testBean32", TestBean32.class);
Assert.assertEquals(ctx.getBean("oracleDataSource"), testBean32.getDataSource());
}
默认情况下(没指定
(3)、扩展@Qualifier限定描述符注解:对@Qualifier的扩展来提供细粒度选择候选者;
具体使用方式就是自定义一个注解并使用@Qualifier注解其即可使用。
首先让我们考虑这样一个问题,如果我们有两个数据源,分别为Mysql和Oracle,因此注入两者相关资源时就牵扯到数据库相关,如在DAO层注入SessionFactory时,当然可以采用前边介绍的方式,但为了简单和直观我们希望采用自定义注解方式。
1、扩展@Qualifier限定描述符注解来分别表示Mysql和Oracle数据源
Java代码
1. package cn.javass.spring.chapter12.qualifier;
2. import org.springframework.beans.factory.annotation.Qualifier;
3. /** 表示注入Mysql相关 */
4. @Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER})
5. @Retention(RetentionPolicy.RUNTIME)
6. @Qualifier
7. public @interface Mysql {
8. }
package cn.javass.spring.chapter12.qualifier;
import org.springframework.beans.factory.annotation.Qualifier;
/** 表示注入Mysql相关 */
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Mysql {
}
Java代码
1. package cn.javass.spring.chapter1