注解装配是Spring2.5后出现的一种有趣的装配方式。它本质上与在xml文件中使用autowire属性自动装配并没有太大区别,但是它允许更细粒度的自动装配,我们可以选择地标注一个属性来对其应用自动装配。
Spring是默认禁止注解装配,所以在使用它之前,我们要在Spring配置中开启它。最简单的启用方式是使用Spring的context命名空间配置中的<context:annotation-config>元素,
这里先介绍Spring3支持的三种注解,Spring4也出来了,还没来得及看,太菜了。
还是用之前的例子:
先写一个简单的Bean
class HelloBean{
private String name;
private int number;
private Date date;
public HelloBean(Date date, String name, int number) {
this.date = date;
this.name = name;
this.number = number;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the number
*/
public int getNumber() {
return number;
}
/**
* @param number the number to set
*/
public void setNumber(int number) {
this.number = number;
}
/**
* @return the date
*/
public Date getDate() {
return date;
}
/**
* @param date the date to set
*/
public void setDate(Date date) {
this.date = date;
}
}
1.使用@Autowired
首先要知道能用@Autowired标识的地方,@Autowired不仅可以标注setter方法,它还能标注需要自动装配Bean引用的任意方法,甚至可以标注构造器。同时,我们可以直接用@Autowired标注某个属性,并删除掉它的setter方法。
注意:@Autowired其实执行的是按类型装配属性,也就是byType。
在上面这个例子中,我们可以用@Autowired直接标注date属性,如下
@Autowired
private Date date;
默认情况下,如果没有bean能被装配到@Autowired所标注的属性或参数中,那装配就失败,抛出一个NoSuchBeanDefinitionException异常(这时候失败比将来抛出空指针要好)。但@Autowired有一个重要的required属性,它默认是true,也我们可以手动设为false,如下:
@Autowired(required=false)
private Date date;
此时,如果Spring没有找到类型为Date的bean,那就把date属性置为null。
另一方面,如果有多个bean同时满足装配条件,@Autowired注解也是没有办法选择的,也会报错NoSuchBeanDefinitionException,此时就需配合使用@Qualifier注解。
@Autowired(required=false)
@Qualifier("<span style="color:#FF0000;">date1</span>")
private Date date;
@Qualifie注解会所需满足条件的bean的范围,上面的例子中,@Qualifie注解尝试注入id为“date1”的bean。
2.@Qualifie,自定义限定器的注解
Qualifie的意思就是限定词,修饰语。在这里,我们暂时只要记住它在上面那个例子中的用法就ok了。其实它的主要作用是用于创建一个自定义的限定器注解。
这个我暂时没有用到,所以就先不写啦,没用也等于没学。
3.@inject
@inject是JSR-330的核心部件,JSR-330是JCP发布java依赖注入规范,该规模让Java有了依赖注入模型。
@inject注解几乎可以完全替换Spring的@Autowired注解,也可以用来自动装配属性、方法和构造器,不同之处在于@inject没有required属性。
@inject也会像@Autowired由于匹配到多个bean导致歧义性,相对于@Autowired所对应的@Qualifie,@inject所对应的@Name。
@Inject
@Name("date1")
private Date date;
4.注解可以为Spring的Bean自动装配其他Bean的引用,我们同样能够使用注解来装配简单的值,有时候这个用的更多一些。Spring3.0引入了@Value,它是一个新的装配注解,可以让我们使用注解装配String类型的值和基本类型的值,例如int,boolean等。
@Value("小苹果")
private String song;
但是@Value真正强大之处在于它可以根据SqEL表达式来进行动态的求值计算,虽然我也没用到过。
@Value("#{systemProperties.myFavoriteSong}")
private String song;