Spring的自动装配Bean的三种方式
spring的自动装配功能的定义:无须在Spring配置文件中描述javaBean之间的依赖关系(如配置<property>、<constructor-arg>)。IOC容器会自动建立javabean之间的关联关系。
如果没有采用自动装配的话,手动装配我们通常在配置文件中进行实现:一下代码就是手动装配:
<beansxmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <beanid="customerDAO"class="com.hebeu.customer.dao.JdbcCustomerDAO"> <propertyname="dataSource"ref="dataSource"/> </bean> </beans>
通过<propertyname="dataSource"ref="dataSource"/>向customerDAO的bean中注入了dataSource
在Spring框架,可以用auto-wiring功能会自动装配Bean。要启用它,只需要在<bean>定义“autowire”属性。
<beanid="customer"class="com.yiibai.common.Customer"autowire="byName"/>
在Spring中,支持5自动装配模式。
- no–缺省情况下,自动配置是通过“ref”属性手动设定
- byName–根据属性名称自动装配。如果一个bean的名称和其他bean属性的名称是一样的,将会自装配它。
- byType–按数据类型自动装配。如果一个bean的数据类型是用其它bean属性的数据类型,兼容并自动装配它。
- constructor–在构造函数参数的byType方式。
- autodetect–如果找到默认的构造函数,使用“自动装配用构造”;否则,使用“按类型自动装配”。【在Spring3.0以后的版本被废弃,已经不再合法了】
第一种自动装配【根据属性名称自动装配】
packagecom.hebeu.model; publicclassCustomer{ privateAddressaddress; publicCustomer(){ } publicCustomer(intid,Addressaddress){ super(); this.address=address; } publicAddressgetAddress(){ returnaddress; } publicvoidsetAddress(Addressaddress){ this.address=address; } }
packagecom.hebeu.model; publicclassAddress{ privateStringfulladdress; publicAddress(){ } publicAddress(Stringaddr){ this.fulladdress=addr; } publicStringgetFulladdress(){ returnfulladdress; } publicvoidsetFulladdress(Stringfulladdress){ this.fulladdress=fulladdress; } }
<beansxmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <beanid="customer"class="com.hebeu.model.Customer"autowire="byName"></bean> <beanid="address"class="com.hebeu.model.Address"> <propertyname="fulladdress"value="YiLongRoad,CA188"></property> </bean> </beans>
这样就将address注入到Customer中。这就是自动注入ByName.在Customerbean中公开了一个属性address,Spring容器会找到addressbean,并且装配。这里必须要注意,Customer中要被注入的bean的set方法要求必须是public的,否则会报空指针异常。还有配置的bean的id必须和Customer中声明的变量名相同。
第二种自动装配【根据数据类型自动装配】
声明的俩个bean同样为Customer以及Address,将applicationContext.xml转换为这样的就是实现根据数据类型进行自动装配。
<beansxmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <beanid="customer"class="com.hebeu.model.Customer"<strong><spanstyle="color:#FF0000;">autowire="byType"</span></strong>></bean> <beanid="bean1"class="com.hebeu.model.Address"> <propertyname="fulladdress"value="YiLongRoad,CA188"></property> </bean> </beans>
类型自动装配的意思是如果一个bean的数据类型与其他的bean属性的数据类型相同,将会自动兼容装配它。当然要求只能配置一个某一个类型的bean.如果配置成这样,那么是会出错的。
<beansxmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <beanid="customer"class="com.hebeu.model.Customer"autowire="byType"></bean> <beanid="bean1"class="com.hebeu.model.Address"> <propertyname="fulladdress"value="YiLongRoad,CA188"></property> </bean> <beanid="bean2"class="com.hebeu.model.Address"> <propertyname="fulladdress"value="YiLongRoad,CA188"></property> </bean> </beans>
第三种自动装配【根据构造方法自动装配】
案例同上,将applicationContext.xml转换为如下,就实现了按照构造方法自动装配:
<beansxmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <beanid="customer"class="com.hebeu.model.Customer"> <!--构造方法的参数--> <constructor-arg> <refbean="bean1"/> </constructor-arg> </bean> <beanid="bean1"class="com.hebeu.model.Address"> <propertyname="fulladdress"value="YiLongRoad,CA188"></property> </bean> </beans>
它实际上是构造函数的参数类型自动装配。这意味着如果一个bean的数据类型与其他bean的构造器参数的数据类型是相同的,那么就自动装配。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。