Autowiring collaborators
自动装配
Spring通过检查
BeanFactory
中的内容,来替指定其他被依赖的bean
优点:
1、
显著减少配置的数量
2、
以使配置与java代码同步更新
XML配置过程中可
在 标签中指定autowire属性,它有5个值(3中官方英文文档中只有前4个):
no :
No autowiring
,
bean之间的关系必须通过ref标签来指定
byName
:
根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。
byType
:
如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。如果存在多个该类型的bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean,则什么事都不发生,属性也不会被设置。如果你不希望这样,那么可以通过设置dependency-check="objects"让Spring抛出异常。
constructor
:
与byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。
@deprecated,autowire="autodetect"这个在spring2.5文档中还有见,但是在3中已经没了,3中的XML配置中添加些值会报错。
autodetect
:
通过bean类的自省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器,那么将使用byType方式。
但是在
spring3的xsd文件中找到default这个值项,应该是替代
autodetect
的吧:
spring3.0Xsd 文件中
default-autowire
的属性只有
no ,
byName
,
byType
,
byType
这里既没有
autodetect
也没有default
default-autowire-candidates
中值的设置解释:
A default bean name pattern for identifying autowire candidates:
e.g. "*Service", "data*", "*Service*", "data*Service".
Also accepts a comma-separated list of patterns: e.g. "*Service,*Dao".
See the documentation for the 'autowire-candidate' attribute of the
' ' element for the semantic details of autowire candidate beans.
但是,我测试了下,发现并没有作用?搜到一外文网页上说如同上写法,但是那是
07年的帖子了。是不是spring3中这个配置没了作用?
/*
dependency-check
依赖检查
:
自动装配中:
autowire-candidate
属性设为
false
,这样容器在查找自动装配对象时将不考虑该bean。
(这块在
spring3中已经移除了?文档中没有找到
)
依赖检查也可以针对每一个bean进行设置。依赖检查默认为not,它有几种不同的使用模式,在xml配置文件中,可以在bean定义中为dependency-check属性使用以下几种值:
none: 没有依赖检查,如果bean的属性没有值的话可以不用设置。
simple: 对于原始类型及集合(除
其他被依赖的bean
外的一切东西)执行依赖检查
object: 仅对
其他被依赖的bean
执行依赖检查
all: 对
其他被依赖的bean
,原始类型及集合执行依赖检查
也找不到:default-dependency-check
*/
将bean排除在自动装配之外
一、
当采用XML格式配置bean时,
元素的
autowire-candidate
属性可被设为
false
,这样容器在查找自动装配对象时将不考虑该bean。
二
、使用对bean名字进行模式匹配来对自动装配进行限制。其做法是在 元素的'default-autowire-candidates'属性中进行设置。比如,将自动装配限制在名字以'Repository'结尾的bean,那么可以设置为"*Repository“。对于多个匹配模式则可以使用逗号进行分隔。注意,如果在bean定义中的'autowire-candidate'属性显式的设置为'true' 或 'false',那么该容器在自动装配的时候优先采用该属性的设置,而模式匹配将不起作用。
< !--EndFragment-->
测试代码:
com.spring305.test.autowire.po.IdCard.java
- public class IdCard {
- private String cardNo;
- private String desc;
- 。。。getter .setter
- }
com.spring305.test.autowire.po.People.java
- public class People {
- private int id;
- private String name;
- private IdCard idCard;
- public People(){
- }
- //autowire="constructor" 要有此构造方法
- public People(IdCard idCard){
- this.idCard = idCard;
- }
- getter setter
- }
src/testAutoWire.xml
- <beans.... http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd
- " default-autowire-candidates="*idCard" >
- <bean id="idCard" class="com.spring305.test.autowire.po.IdCard">bean>
- <bean id="people" class="com.spring305.test.autowire.po.People" autowire="byName">bean>
-
测试:
- //@Test//xml
- public void AutoWireTestXML() {
- ApplicationContext context = new ClassPathXmlApplicationContext("testAutoWire.xml");
- People people = (People) context.getBean("people");
- IdCard idCard = people.getIdCard();
- // autowire="byName" 当people bean上没有加这个标签时,打印值为null,加后则打印出了对象
- System.out.println(idCard);
- }
annotation测试:com.spring305.test.autowire.po.IdCardAnnotation.java- @Configuration
- public class IdCardAnnotation {
- private String cardNo;
- private String desc;
- 。。。。getter...setter
- }
com.spring305.test.autowire.po.PeopleAnnotation.java- @Configuration
- public class PeopleAnnotation {
- private int id;
- private String name;
- private IdCardAnnotation idCardAnnotation;
- @Autowired(required = false)
- //@Qualifier("idCardAnnotation")
- public void setIdCardAnnotation(@Qualifier("idCardAnnotation")IdCardAnnotation idCardAnnotation) {
- this.idCardAnnotation = idCardAnnotation;
- }
- getter.setter
- }
测试:- @Test
- public void AutoWireTestAnnotation() {
- ApplicationContext context = new AnnotationConfigApplicationContext(IdCardAnnotation.class,PeopleAnnotation.class);
- PeopleAnnotation people = (PeopleAnnotation) context.getBean("peopleAnnotation");
- IdCardAnnotation idCard = people.getIdCardAnnotation();
- System.out.println(idCard);
- }