Spring零配置通过注解实现Bean依赖注入总结(五)

2014-11-24 07:34:28 · 作者: · 浏览: 3
,方法注入不支持静态类型方法的注入。

注意“initMessage(String message, ArrayList list)”方法签名中为什么使用ArrayList而不是List呢?具体参考【3.3.3 自动装配】一节中的集合类型注入区别。





三、@Value:注入SpEL表达式;

用于注入SpEL表达式,可以放置在字段方法或参数上,使用方式如下:


Java代码
1. @Value(value = "SpEL表达式")
2. 字段、方法、参数
@Value(value = "SpEL表达式")
字段、方法、参数

1、可以在类字段上使用该注解:


Java代码
1. @Value(value = "#{message}")
2. private String message;
@Value(value = "#{message}")
private String message;

2、可以放置在带@Autowired注解的方法的参数上:


Java代码
1. @Autowired
2. public void initMessage(@Value(value = "#{message}#{message}") String message) {
3. this.message = message;
4. }
@Autowired
public void initMessage(@Value(value = "#{message}#{message}") String message) {
this.message = message;
}

3、还可以放置在带@Autowired注解的构造器的参数上:


Java代码
1. @Autowired
2. private TestBean43(@Value(value = "#{message}#{message}") String message) {
3. this.message = message;
4. }
@Autowired
private TestBean43(@Value(value = "#{message}#{message}") String message) {
this.message = message;
}
具体测试详见DependencyInjectWithAnnotationTest 类的testValueInject测试方法。




四、@Qualifier:限定描述符,用于细粒度选择候选者;

@Autowired默认是根据类型进行注入的,因此如果有多个类型一样的Bean候选者,则需要限定其中一个候选者,否则将抛出异常,详见【3.3.3 自动装配】中的根据类型进行注入;

@Qualifier限定描述符除了能根据名字进行注入,但能进行更细粒度的控制如何选择候选者,具体使用方式如下:


Java代码
1. @Qualifier(value = "限定标识符")
2. 字段、方法、参数
@Qualifier(value = "限定标识符")
字段、方法、参数

(1)、根据基于XML配置中的标签指定的名字进行注入,使用如下方式指定名称:


Java代码
1.


其中type属性可选,指定类型,默认就是Qualifier注解类,name就是给Bean候选者指定限定标识符,一个Bean定义中只允许指定类型不同的,如果有多个相同type后面指定的将覆盖前面的。


1、准备测试Bean:


Java代码
1. package cn.javass.spring.chapter12;
2. import javax.sql.DataSource;
3. import org.springframework.beans.factory.annotation.Autowired;
4. import org.springframework.beans.factory.annotation.Qualifier;
5.
6. public class TestBean31 {
7. private DataSource dataSource;
8. @Autowired
9. //根据标签指定Bean限定标识符
10. public void initDataSource(@Qualifier("mysqlDataSource") DataSource dataSource) {
11. this.dataSource = dataSource;
12. }
13. public DataSource getDataSource() {
14. return dataSource;
15. }
16. }
package cn.javass.spring.chapter12;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

public class TestBean31 {
private DataSource dataSource;
@Autowired
//根据标签指定Bean限定标识符
public void initDataSource(@Qualifier("mysqlDataSource") DataSource dataSource) {
this.dataSource = dataSource;
}
public DataSource getDataSource() {
return dataSource;
}
}

2、在Spring配置文件(chapter12/dependecyInjectWithAnnotation.xml)添加如下Bean配置:


Java代码
1.


我们使用@Qualifier("mysqlDataSource")来指定候选Bean的限定标识符,我们需要在配置文件中使用标签来指定候选Bean的限定标识符“mysqlDataSource”:


Java代码
1.
2.
3.





3、测试方法如下:


Java代码
1. @Test
2. public void testQualifierInject1() {
3. TestBean31 testBean31 = ctx.getBean("testBean31", TestBean31.class);
4. try {
5. //使用指定的标识符只能被@Qualifier使用
6. ctx.getBean("mysqlDataSource");
7. Assert.fail();
8. } catch (Exception e) {
9. //找不到该Bean
10. Assert.assertTrue(e instanceof NoSuchBeanDef