使用Spring由構(gòu)造方法自動裝配
Spring由構(gòu)造方法自動裝配
在Spring中,可以使用“通過構(gòu)造自動裝配”,實際上是按構(gòu)造函數(shù)的參數(shù) 類型自動裝配。 這意味著,如果一個bean的數(shù)據(jù)類型與其他bean的構(gòu)造器參數(shù)的數(shù)據(jù)類型是相同的,那么將自動裝配。
下面看看Spring構(gòu)造函數(shù)自動裝配的一個完整例子。
1. Beans
這里有兩個 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裝配
通常情況下,你可以通過構(gòu)造這樣自動裝配 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]]
隨著自動裝配用構(gòu)造函數(shù)啟用后,你可以不設(shè)置構(gòu)造器屬性。Spring會找到兼容的數(shù)據(jù)類型,并自動裝配它。
<?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)Spring裝配Bean屬性時,有時候非常明確,就是需要將某個Bean的引用裝配給指定屬性。
先寫兩個類
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中注入UserDao需要顯式的手動裝配
<bean id="userDao" class="com.beans.UserDao"></bean> <bean id="userService" class="com.beans.UserServcie"> <property name="userDao" ref="userDao"></property> </bean>
這種寫法會是開發(fā)效率變慢。
因此出現(xiàn)了spring的自動裝配方式:五種自動裝配方式 no、byName、byType、constructor、default。
1、no
當(dāng)使用autowire="no"時,不使用自動裝配,依然需要手動裝配,需要顯式指定某個bean的引用。
<bean id="userService" class="com.beans.UserServcie" autowire="no">
<property name="userDao" ref="userDao"></property>
</bean>
2、byName
使用autowire="byName"裝配方式時,就是使用名字裝配,不需要顯式指定某個bean的引用,此時使用的是setter方式注入。此時要注意需要被注入的bean的id和注入的bean的屬性名之間的匹配,否則失敗注入不成功。
例如:UserService中需要注入UserDao, private UserDao userDao,當(dāng)byName注入時,spring會在ioc容器中尋找id="userDao"的對象,找到注入成功,找不到注入失敗。
public class UserServcie {
private UserDao userDao;
public UserServcie(UserDao userDao){}
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
public UserDao getUserDao(){
return userDao;
}
}
此時的配置文件為
<bean id="userDao" class="com.beans.UserDao"></bean> <bean id="userService" class="com.beans.UserServcie" autowire="byName"></bean>
3、byType
使用autowire="byType"裝配方式時,就是使用類型裝配,不需要顯式指定某個bean的引用,此時使用的是setter方式注入。此時需要注意ioc容器中不允許出現(xiàn)同一個類型的兩個及以上個數(shù)量的實例,否則失敗報異常。
此時的配置文件為
<bean id="userDao" class="com.beans.UserDao"></bean> <bean id="userService" class="com.beans.UserServcie" autowire="byType"></bean>
4、constructor
使用autowire="constructor "裝配方式時,默認也是使用byType方式裝配,只是不同的是按照構(gòu)造器參數(shù)的類型進行裝配,構(gòu)造器方式注入。
<bean id="userDao" class="com.beans.UserDao"></bean> <bean id="userService" class="com.beans.UserServcie" autowire="constructor"></bean>
5、default
使用autowire="default"裝配方式時,是使用父級標簽的默認裝配方式,我們這里也就是指<bean/>的父級標簽<beans>的默認裝配方式進行裝配。例如:
<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標簽使用的是byType方式,對于userService1 使用的autowire="default",就會使用beans的byType方式裝配,而 userService1的autowire="byName"則會使用byName裝配。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
如何在IDEA啟動多個Spring Boot工程實例(圖文)
這篇文章主要介紹了如何在IDEA啟動多個Spring Boot工程實例(圖文),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
Mybatis-Plus使用p6spy對SQL性能進行監(jiān)控的方法
這篇文章主要介紹了Mybatis-Plus使用p6spy對SQL性能進行監(jiān)控的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
IDEA自動生成TestNG的testng.xml的插件方法
這篇文章主要介紹了IDEA自動生成TestNG的testng.xml的插件方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
SpringBoot中忽略實體類中的某個屬性不返回給前端的方法(示例詳解)
本文介紹了在Spring Boot中使用Jackson和Fastjson忽略實體類屬性不返回給前端的方法,在Jackson中,同時使用@JsonProperty和@JsonIgnore時,@JsonIgnore可能失效,Fastjson中可以使用@JSONField(serialize=false)來實現(xiàn),本文結(jié)合實例代碼介紹的非常詳細,需要的朋友參考下吧2024-11-11

