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{
...
@Autowired
public void setPrefixGenerator(PrefixGenerator prefixGenerator){
this.prefixGenerator = prefixGenerator;
}
}
如果在IOC容器里存在一个类型与PrefixGenerator兼容的Bean,它将会被自动设置给prefixGenerator属性。
<beans ...> ... <bean id="sequenceGenerator" class="com.apress.springrecipes. sequence.SequenceGenerator"> <property name="initial" value="100000"/> <property name="suffix" value="A"/> </bean> <bean id="datePrefixGenerator" class="com.apress.springrecipes.sequence. DatePrefixGenerator"> <property name="pattern" 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{
...
@Autowired
public 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{
@Autowired
private PrefixGenerator prefixGenerator;
....
}
甚至可以在具有任意个参数和任意名称的方法上应用@Autowired注解。此时,Spring将试着给每个方法参数装配类型兼容的Bean。
package com.apress.springrecipes.sequence;
import org.springframework.beans.factory.annotation.Autowired;
public class SequenceGenerator{
....
@Autowired
public void inject(PrefixGenerator prefixGenerator){
this.prefixGenerator = prefixGenerator;
}
}