使用Spring由構(gòu)造方法自動(dòng)裝配
Spring由構(gòu)造方法自動(dòng)裝配
在Spring中,可以使用“通過(guò)構(gòu)造自動(dòng)裝配”,實(shí)際上是按構(gòu)造函數(shù)的參數(shù) 類型自動(dòng)裝配。 這意味著,如果一個(gè)bean的數(shù)據(jù)類型與其他bean的構(gòu)造器參數(shù)的數(shù)據(jù)類型是相同的,那么將自動(dòng)裝配。
下面看看Spring構(gòu)造函數(shù)自動(dòng)裝配的一個(gè)完整例子。
1. Beans
這里有兩個(gè) beans, 分別是:developer 和 language
public class Developer { private Language language; public Language getLanguage() { return language; } public void setLanguage(Language language) { this.language = language; } @Override public String toString() { return "Developer [language=" + language + "]"; } } public class Language { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Language [name=" + name + "]"; } }
2. Spring裝配
通常情況下,你可以通過(guò)構(gòu)造這樣自動(dòng)裝配 Bean:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="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.xsd"> <bean id="developer" class="com.ray.common.Developer"> <constructor-arg> <ref bean="language"/> </constructor-arg> </bean> <bean id="language" class="com.ray.common.Language"> <property name="name" value="Java"/> </bean> </beans>
輸出
Developer [language=Language [name=Java]]
隨著自動(dòng)裝配用構(gòu)造函數(shù)啟用后,你可以不設(shè)置構(gòu)造器屬性。Spring會(huì)找到兼容的數(shù)據(jù)類型,并自動(dòng)裝配它。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="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.xsd"> <bean id="developer" class="com.ray.common.Developer" autowire="constructor" /> <bean id="language" class="com.ray.common.Language"> <property name="name" value="Java"/> </bean> </beans>
輸出
Developer [language=Language [name=Java]]
spring的五種自動(dòng)裝配方式
當(dāng)Spring裝配Bean屬性時(shí),有時(shí)候非常明確,就是需要將某個(gè)Bean的引用裝配給指定屬性。
先寫(xiě)兩個(gè)類
public class UserServcie { private UserDao userDao; public UserServcie(UserDao userDao){} public void setUserDao(UserDao userDao){ this.userDao = userDao; } public UserDao getUserDao(){ return userDao; } } public class UserDao { }
例如:在UserServcie中注入U(xiǎn)serDao需要顯式的手動(dòng)裝配
<bean id="userDao" class="com.beans.UserDao"></bean> <bean id="userService" class="com.beans.UserServcie"> <property name="userDao" ref="userDao"></property> </bean>
這種寫(xiě)法會(huì)是開(kāi)發(fā)效率變慢。
因此出現(xiàn)了spring的自動(dòng)裝配方式:五種自動(dòng)裝配方式 no、byName、byType、constructor、default。
1、no
當(dāng)使用autowire="no"時(shí),不使用自動(dòng)裝配,依然需要手動(dòng)裝配,需要顯式指定某個(gè)bean的引用。
<bean id="userService" class="com.beans.UserServcie" autowire="no"> <property name="userDao" ref="userDao"></property> </bean>
2、byName
使用autowire="byName"裝配方式時(shí),就是使用名字裝配,不需要顯式指定某個(gè)bean的引用,此時(shí)使用的是setter方式注入。此時(shí)要注意需要被注入的bean的id和注入的bean的屬性名之間的匹配,否則失敗注入不成功。
例如:UserService中需要注入U(xiǎn)serDao, private UserDao userDao,當(dāng)byName注入時(shí),spring會(huì)在ioc容器中尋找id="userDao"的對(duì)象,找到注入成功,找不到注入失敗。
public class UserServcie { private UserDao userDao; public UserServcie(UserDao userDao){} public void setUserDao(UserDao userDao){ this.userDao = userDao; } public UserDao getUserDao(){ return userDao; } }
此時(shí)的配置文件為
<bean id="userDao" class="com.beans.UserDao"></bean> <bean id="userService" class="com.beans.UserServcie" autowire="byName"></bean>
3、byType
使用autowire="byType"裝配方式時(shí),就是使用類型裝配,不需要顯式指定某個(gè)bean的引用,此時(shí)使用的是setter方式注入。此時(shí)需要注意ioc容器中不允許出現(xiàn)同一個(gè)類型的兩個(gè)及以上個(gè)數(shù)量的實(shí)例,否則失敗報(bào)異常。
此時(shí)的配置文件為
<bean id="userDao" class="com.beans.UserDao"></bean> <bean id="userService" class="com.beans.UserServcie" autowire="byType"></bean>
4、constructor
使用autowire="constructor "裝配方式時(shí),默認(rèn)也是使用byType方式裝配,只是不同的是按照構(gòu)造器參數(shù)的類型進(jìn)行裝配,構(gòu)造器方式注入。
<bean id="userDao" class="com.beans.UserDao"></bean> <bean id="userService" class="com.beans.UserServcie" autowire="constructor"></bean>
5、default
使用autowire="default"裝配方式時(shí),是使用父級(jí)標(biāo)簽的默認(rèn)裝配方式,我們這里也就是指<bean/>的父級(jí)標(biāo)簽<beans>的默認(rèn)裝配方式進(jìn)行裝配。例如:
<beans default-autowire="byType" xmlns="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.xsd"> <bean id="userDao" class="com.beans.UserDao"></bean> <bean id="userService1" class="com.beans.UserServcie" autowire="default"></bean> <bean id="userService2" class="com.beans.UserServcie" autowire="byName"></bean> </beans>
這里beans標(biāo)簽使用的是byType方式,對(duì)于userService1 使用的autowire="default",就會(huì)使用beans的byType方式裝配,而 userService1的autowire="byName"則會(huì)使用byName裝配。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringMVC如何在生產(chǎn)環(huán)境禁用Swagger的方法
本篇文章主要介紹了SpringMVC如何在生產(chǎn)環(huán)境禁用Swagger的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02解決springboot項(xiàng)目啟動(dòng)失敗Could not initialize class&
這篇文章主要介紹了解決springboot項(xiàng)目啟動(dòng)失敗Could not initialize class com.fasterxml.jackson.databind.ObjectMapper問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06SpringBoot使用PropertiesLauncher加載外部jar包
這篇文章主要介紹了SpringBoot使用PropertiesLauncher加載外部jar包,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07原理分析SonarQube中IdentityProvider賬戶互斥現(xiàn)象
這篇文章主要為大家介紹分析SonarQube中IdentityProvider賬戶互斥現(xiàn)象原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02使用Java代碼實(shí)現(xiàn)RocketMQ的生產(chǎn)與消費(fèi)消息
這篇文章介紹一下其他的小組件以及使用Java代碼實(shí)現(xiàn)生產(chǎn)者對(duì)消息的生成,消費(fèi)者消費(fèi)消息等知識(shí)點(diǎn),并通過(guò)代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-07-07JMeter自定義日志與日志分析的實(shí)現(xiàn)
JMeter與Java程序一樣,會(huì)記錄事件日志,本文就介紹一下JMeter自定義日志與日志分析的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12