Spring3
来源:互联网 发布:云计算平台特点 编辑:程序博客网 时间:2024/05/16 16:04
Spring3 - Spring 自动装配 Bean
1. Auto-Wiring ‘no’
2. Auto-Wiring ‘byName’
3. Auto-Wiring ‘byType
4. Auto-Wiring ‘constructor’
5. Auto-Wiring ‘autodetect’
Spring Auto-Wiring Beans——Spring自动装配Bean
所谓自动装配,就是将一个Bean注入到其他Bean的Property中,类似于以下:
<bean id="customer" class="com.lei.common.Customer" autowire="byName" />
Spring支持 5 种自动装配模式,如下:
no ——默认情况下,不自动装配,通过 “ref” attribute手动设定。
byName ——根据Property的Name自动装配,如果一个bean的name,和另一个bean中的Property的 [name]相同,则自动装配这个bean到Property中。
byType ——根据Property的数据类型(Type)自动装配,如果一个bean的数据类型,兼容另一个bean中Property的 [数据类型],则自动装配。
constructor ——根据构造函数参数的数据类型,进行byType模式的自动装配。
autodetect ——如果发现默认的构造函数,用constructor模式,否则,用byType模式。
下例中演示自动装配
Customer.java如下:
package com.lei.common; public class Customer { private Person person; public Customer(Person person) { //======自身构造方法====== this.person = person; } public void setPerson(Person person) { this.person = person; } //...}
Person.java如下:
package com.lei.common; public class Person { //...}
1. Auto-Wiring ‘no’
默认情况下,需要通过 'ref’ 来装配bean,如下:
<bean id="customer" class="com.lei.common.Customer"> <property name="person" ref="person" /></bean>
<bean id="person" class="com.lei.common.Person" />
2. Auto-Wiring ‘byName’(根据 bean标签中的 id名 去匹配)
根据属性Property的名字装配bean,这种情况,Customer设置了autowire="byName",Spring会自动寻找与属性名字“person”相同的bean,找到后,通过调用setPerson(Person person)将其注入属性。
<bean id="customer" class="com.lei.common.Customer" autowire="byName" /><bean id="person" class="com.lei.common.Person" />
如果根据 Property name找不到对应的bean配置,如下
<bean id="customer" class="com.lei.common.Customer" autowire="byName" /><bean id="person_another" class="com.lei.common.Person" />
Customer中Property名字是person,但是配置文件中找不到person,只有person_another,这时就会装配失败,运行后,Customer中person=null。
3. Auto-Wiring ‘byType (根据 bean标签中的 class 去匹配)
根据属性Property的数据类型自动装配,这种情况,Customer设置了autowire="byType",Spring会总动寻找与属性类型相同的bean,找到后,通过调用setPerson(Person person)将其注入。
<bean id="customer" class="com.lei.common.Customer" autowire="byType" /><bean id="person" class="com.lei.common.Person" />
如果配置文件中有两个类型相同的bean会怎样呢?如下:
<bean id="customer" class="com.lei.common.Customer" autowire="byType" /><bean id="person" class="com.lei.common.Person" /><bean id="person_another" class="com.lei.common.Person" />
一旦配置如上,有两种相同数据类型的bean被配置,将抛出UnsatisfiedDependencyException异常,见以下:
Exception in thread "main" org.springframework.beans.factory.UnsatisfiedDependencyException:
所以,一旦选择了’byType’类型的自动装配,请确认你的配置文件中每个数据类型定义一个唯一的bean。
4. Auto-Wiring ‘constructor’
这种情况下,Spring会寻找与参数数据类型相同的bean,通过构造函数public Customer(Person person)将其注入。
<bean id="customer" class="com.lei.common.Customer" autowire="constructor" /><bean id="person" class="com.lei.common.Person" />
5. Auto-Wiring ‘autodetect’
这种情况下,Spring会先寻找Customer中是否有默认的构造函数,
=====如果有相当于上边的’constructor’这种情况,用构造函数注入,
=====否则,用’byType’这种方式注入。
所以,此例中通过调用public Customer(Person person)将其注入。
<bean id="customer" class="com.lei.common.Customer" autowire="autodetect" /><bean id="person" class="com.lei.common.Person" />
注意:
项目中autowire结合dependency-check一起使用是一种很好的方法,这样能够确保属性总是可以成功注入。
<bean id="customer" class="com.lei.common.Customer" autowire="autodetect" dependency-check="objects" /><bean id="person" class="com.lei.common.Person" />
最后,我认为,自动装配虽然让开发变得更快速,但是同时却要花更大的力气维护,因为它增加了配置文件的复杂性,你甚至不知道哪一个bean会被自动注入到另一个bean中。我更愿意写配置文件来手工装配。
- spring3
- spring3
- Spring3
- spring3
- spring3
- Spring3
- spring3
- Spring3
- spring3注解
- spring3 配置文件
- Spring3.0.5
- spring3+hibernate3
- Spring3.0.5
- Spring3 @Transaction
- spring3 mvc
- Spring3 MVC
- Spring3 MVC
- spring3开发
- Nagios 监控总结
- Unable to compile class for JSP
- Installation failed with message INSTALL_FAILED_NO_MATCHING_ABIS
- 文章标题
- 专升本高数学习总结——二重积分
- Spring3
- Android源代码下载教程
- java之通过反射获取类中的注解值
- 对话高考网(1)
- TCP三次握手与四次挥手
- 证书类型
- ubuntu 安装 mysql
- Java中的不可变类
- TCP同步与异步及阻塞模式,多线程+阻塞模式,非阻塞模式简单介绍