简化Spring的xml文件配置-注解装配

来源:互联网 发布:淘宝客服改差评话术 编辑:程序博客网 时间:2024/06/06 18:28

注解装配是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。

同时还要注意,当使用@Autowired来标识构造器时,只能有一个构造器可以将@Autowired的required设为true。


另一方面,如果有多个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;





0 0