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;}}
?
?
?