读书人

spring之施用@Autowired和@Resource自

发布时间: 2012-11-01 11:11:33 作者: rapoo

spring之使用@Autowired和@Resource自动装配Bean(2)

spring之使用@Autowired和@Resource自动装配Bean(2)

----------

?

?

自动装配具有兼容类型的单个Bean

?

可以给特定的属性添加@Autowired注解,Spring将会对它进行自动装配。例如,可以给prefixGenerator属性的setter方法加上@Autowired注解。此时,Spring将会试着装配类型与PrefixGenerator兼容的Bean。

?

package com.apress.springrecipes.sequence;import org.springframework.beans.factory.annotation.Autowired;public class SequenceGenerator{...@Autowiredpublic void setPrefixGenerator(PrefixGenerator prefixGenerator){this.prefixGenerator = prefixGenerator;}}

?

如果在IOC容器里存在一个类型与PrefixGenerator兼容的Bean,它将会被自动设置给prefixGenerator属性。

<beans ...>...<bean id="sequenceGenerator" value="100000"/><property name="suffix" value="A"/></bean><bean id="datePrefixGenerator" value="yyyyMMdd"/></bean></beans>

?默认情况下,所有应用了@Autowired注解的属性都需要被设置。当Spring找不到匹配的Bean装配属性时, 将会抛出异常。如果某一属性并不一定需要被设置,那么可以设置@Autowired的required属性为false.此时,如果Spring不能找到匹配的Bean,该属性将不被设置。

package com.apress.springrecipes.sequence;import org.springframework.beans.factory.annotation.Autowired;public class SequenceGenerator{...@Autowired(requered=false)public void setPrefixGenerator(PrefixGenerator prefixGenerator){this.prefixGenerator = prefixGenerator;}}

除了setter方法之外,构造器也可以使用@Autowired注解。此时,Spring将试着为构造器的每个参数找出类型兼容的Bean.?

package com.apress.springrecipes.sequence;import org.springframework.beans.factory.annotation.Autowired;public class SequenceGenerator{...@Autowiredpublic SequenceGenerator(PrefixGenerator prefixGenerator){this.prefixGenerator = prefixGenerator;}}

?即使没有声明public,字段也一样可以使用@Autowired注解。在这种情况下,可以不用为该字段声明setter方法或构造器。Spring将通过反射为该字段注入匹配的Bean,不过,因为难以单元测试,所以给非公共字段添加@Autowired注解会降低代码的可测试性。

package com.apress.springrecipes.sequence;import org.springframework.beans.factory.annotation.Autowired;public class SequenceGenerator{@Autowiredprivate PrefixGenerator prefixGenerator;....}

甚至可以在具有任意个参数和任意名称的方法上应用@Autowired注解。此时,Spring将试着给每个方法参数装配类型兼容的Bean。?

package com.apress.springrecipes.sequence;import org.springframework.beans.factory.annotation.Autowired;public class SequenceGenerator{....@Autowiredpublic void inject(PrefixGenerator prefixGenerator){this.prefixGenerator = prefixGenerator;}}

?

?

?

读书人网 >编程

热点推荐