Spring中自動裝配
Spring中自動裝配
Spring中有四種自動裝配型別,分別為:byName,byType,constructor,autodetect,下面來分別介紹一下這些是如何自動裝配的
<bean id="foo" class="...Foo" autowire="autowire type">
有四種自動裝配型別:
1.byName:尋找和屬性名相同的bean,若找不到,則裝不上。
2.byType:尋找和屬性型別相同的bean,找不到,裝不上,找到多個拋異常。
3.constructor:查詢和bean的構造引數一致的一個或
多個bean,若找不到或找到多個,拋異常。按照引數的型別裝配
4.autodetect: (3)和(2)之間選一個方式。不確定性的處理與(3)和(2)一致。
<bean id="bar" class="Bar" autowire="byName"/>
在介紹例項之前先要建立結構,我們以一個例項開始,用Customers來做例項,例項的結構為:
我們要建立一個CustomersServiceImpl.java,內容為:
package cn.csdn.hr.service;
import cn.csdn.hr.dao.BaseDao;
import cn.csdn.hr.dao.CustomersDao;
import
publicclass CustomersServiceImpl implements CustomersService {
private CustomersDao customersDao = new CustomersDaoImpl();
private BaseDao baseDao;
// set方法注入
publicvoid setCustomersDao(CustomersDao customersDao) {
this.customersDao = customersDao;
}
publicvoid setBaseDao(BaseDao baseDao) {
this.baseDao = baseDao;
}
public CustomersDao getCustomersDao() {
returncustomersDao;
}
public BaseDao getBaseDao() {
returnbaseDao;
}
}
在xml中對上面的兩個屬性進行注入
1.首先來介紹一下沒有autowire的效果,
<?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-2.5.xsd">
<!-- bean的注入方式ref屬性 ref元素-->
<!-- autowire自動裝配的型別 -->
<bean id="customersServiceImpl" class="cn.csdn.hr.service.CustomersServiceImpl">
<property name="customersDao">
<bean class="cn.csdn.hr.dao.CustomersDaoImpl"/>
</property>
<property name="baseDao">
<bean class="cn.csdn.hr.dao.BaseHibernateDaoImpl"/>
</property>
</bean>
</beans>
也可以用ref引用的方式來寫,可以寫為:
<?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-2.5.xsd">
<bean id="customersServiceImpl" class="cn.csdn.hr.service.CustomersServiceImpl">
<property name="customersDao">
<ref bean="customersDao"/>
</property>
<property name="baseDao">
<ref bean="baseDao"/>
</property>
</bean>
<bean id="customersDao" class="cn.csdn.hr.dao.CustomersDaoImpl"/>
<bean id="baseDao" class="cn.csdn.hr.dao.BaseHibernateDaoImpl"/>
</beans>
這樣,在junit中測試為:
publicvoid test() {
//獲取應用程式上下文物件
ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:beanAuto.xml");
CustomersServiceImpl customersServiceImpl = (CustomersServiceImpl) ac.getBean("customersServiceImpl");
System.out.println("baseDao的例項"+customersServiceImpl.getBaseDao());
System.out.println("customersDao的例項"+customersServiceImpl.getCustomersDao());
}
我們可以得到:
baseDao的例項[email protected]
2.當把autowire設定為byName的時候,可以省略很多的程式碼,在junit和其他都不動的情況下,只改變xml,beanByName.xml中的程式碼為:
<?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-2.5.xsd">
<!-- autowire自動裝配的型別
byName是根據名稱自動裝配
-->
<bean id="customersServiceImpl" class="cn.csdn.hr.service.CustomersServiceImpl" autowire="byName"/>
<bean id="customersDao" class="cn.csdn.hr.dao.CustomersDaoImpl"></bean>
<bean id="baseDao" class="cn.csdn.hr.dao.BaseHibernateDaoImpl"></bean>
</beans>
注:當autowire="byName"時,cn.csdn.hr.service.CustomersServiceImpl 屬性名與bean的id名稱的名稱相同會自動裝配。
3.當把autowire設定為byType的時候
<?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-2.5.xsd">
<!-- autowire自動裝配的型別
byType是根據型別自動裝配型別不能相同
cn.csdn.hr.service.CustomersServiceImpl 屬性型別與bean中有相同的型別的時候會自動裝配
-->
<bean id="customersServiceImpl" class="cn.csdn.hr.service.CustomersServiceImpl" autowire="byType"/>
<bean id="customersDaoImpl" class="cn.csdn.hr.dao.CustomersDaoImpl"></bean>
<bean id="baseDaoImpl" class="cn.csdn.hr.dao.BaseHibernateDaoImpl"></bean>
</beans>
注:不可以有相同的型別,也就是說不可以有相同的類名存在,id可有可無,但是一般情況下是存在的,它與其他的沒有關聯
4.當把autowire設定為constructor的時候
<?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-2.5.xsd">
<!-- autowire自動裝配的型別
constructor是根據型別自動裝配根據構造器的引數來顯示
cn.csdn.hr.service.CustomersServiceImpl 屬性型別與bean中有相同的型別的時候會自動裝配
-->
<bean id="customersServiceImpl" class="cn.csdn.hr.service.CustomersServiceImpl" autowire="constructor"/>
<bean id="customersDaoImpl" class="cn.csdn.hr.dao.CustomersDaoImpl"/>
<bean id="baseDaoImpl" class="cn.csdn.hr.dao.BaseHibernateDaoImpl"/>
</beans>
注:在執行這個xml的時候,要有建構函式,經過驗證得出必須有有參構造才可以全部得到
5.當把autowire設定為autodetect的時候
<?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-2.5.xsd">
<!-- autowire自動裝配的型別
cn.csdn.hr.service.CustomerServiceImpl
有沒有預設的構造沒有就採用byType型別如果沒有則採用constructor -->
<bean id="customersServiceImpl" class="cn.csdn.hr.service.CustomersServiceImpl" autowire="autodetect" />
<bean id="customersDaoImpl" class="cn.csdn.hr.dao.CustomersDaoImpl" />
<bean id="baseDaoImpl" class="cn.csdn.hr.dao.BaseHibernateDaoImpl" />
</beans>
相關推薦
在Spring中自動裝配Bean的屬性
Spring的最基本的能力就是DI,即依賴注入,或控制反轉,它可以為Bean注入其依賴的其他Bean。 一個Bean依賴其他Bean一般是通過在Bean中定義其他Bean的成員變數的方式來實現的,那麼,Spring的DI也就表現為給Bean的屬性自動注入值。 這一般分為以下其中情況。 1
spring中自動裝配的有哪些
在框架中共有5種自動裝配: 1. no:這是Spring框架的預設設定,在該設定下自動裝配是關閉的,開發者需要自行在bean定義中用標籤明確的設定依賴關係。 2. byN
Spring中自動裝配的三種方式
Sprring中Bean的自動裝配有3種方法:一、byName 二、byType 三、Constructor 第一步:配置我們的spring-autowriting.xml,我們先使用第一種方法ByName 第二步:建立3個類,一個測試類TestAutoWriting,一
Spring中自動裝配
Spring中自動裝配 Spring中有四種自動裝配型別,分別為:byName,byType,constructor,autodetect,下面來分別介紹一下這些是如何自動裝配的 <bean id="foo" class="...Foo" autowire="a
Spring框架中自動裝配模式的區別
spring的自動裝配功能的定義:無須在Spring配置檔案中描述javaBean之間的依賴關係(如配置<property>、<constructor-arg>)。IOC容器會自動建立javabean之間的關聯關係。 簡而言之,一個類就是一個Bean,Spring框架是一個Bean容
5.Spring MVC 自動裝配問題
spring getbean ram ng- get wire enc system say 一.使用@controller註解,實際上也是在IOC容器中配置了,它的id是類的首字母小寫 一.使用@controller註解,實際上也是在IOC容器中配置了,它的id是類的首字
後端-框架-Spring-MyBatis-自動裝配
後端-框架-Spring-MyBatis-自動裝配 bean標籤下autowire屬性 autowire value no 手動裝配 byName
Spring Bean 自動裝配 的歧義性(bean 的名稱重複)處理
在spring 中,spring 對於上下文的bean ,當自動裝配時,如果bean 的名稱相同,spring 無法做出選擇 。這就所謂的bean 自動裝配的歧義性。所以,當發現歧義性的時候,需要通過一些的方案來解決這個問題。 將可選bean 中的某個設定為首選(primary)的bea
Spring. 處理自動裝配的歧義性
在使用 @Autowired 註解的時候,如果有多個 bean 都能滿足依賴關係,Spring 將丟擲一個異常,這時,我們有必要處理自動裝配的歧義性,來唯一確定一個要使用的 bean。 1.標示首選的 bean 在宣告 bean 的時候,可通過將其中一個可選的 bean 設為首選(&nb
3.spring:自動裝配/Bean之間的關係/作用域/外部檔案/spel/
1.自動裝配/手動裝配 xml配置檔案裡的bean自動裝配 Spring IOC 容器裡可以自動的裝配Bean,需要做的僅僅是在<bean>的autowire屬性裡面指定自動裝配模式 ->byType(根據型別自動進行裝配):若IOC容器裡需要有多個與目標Bean型別一樣的Bean,在這種
3.spring:自動裝配/Bean之間的關系/作用域/外部文件/spel/
depends ... 完全 構造器 外部文件 conn wire odi host 1.自動裝配/手動裝配 xml配置文件裏的bean自動裝配 Spring IOC 容器裏可以自動的裝配Bean,需要做的僅僅是在<bean>的autowire屬性裏面指定自動裝
Spring之自動裝配
自動裝配 Spring利用依賴注入(DI),完成對IOC容器中中各個元件的依賴關係賦值 1)、@Autowired:自動注入: 預設優先按照型別去容器中找對應的元件:applicationContext.getBean(BookDao.class),找到就賦值
Spring Boot 自動裝配
底層裝配技術 Spring 模式註解裝配 Spring @Enable 模組裝配 Spring 條件裝配裝配 Spring 工廠載入機制 實現類: SpringFactoriesLoader 配置資源: META-INF/spring.factories
Spring的自動裝配機制
Spring IoC容器可以自動裝配(autowire)相互協作bean之間的關聯關係。因此,如果可能的話,可以自動讓Spring通過檢查BeanFactory中的內容,來替我們指定bean的協作者(其他被依賴的bean)。autowire一共有五種型別
學習spring bean自動裝配
Spring 容器可以在不使用<constructor-arg>和<property> 元素的情況下自動裝配相互協作的 bean 之間的關係,這有助於減少編寫一個大的基於 Spring 的應用程式的 XML 配置的數量。 自動裝配模式 下列自動裝配模式,
Spring處理自動裝配的歧義性
sys 技術分享 正在 限定 component 分享圖片 pen 地方 16px 1.標識首選的bean 2.使用限定符@Qualifier 首先在bean的聲明上添加@Qualifier 註解: 1 @Component 2 @Qualifier("cdt
spring中自動註解配置以及@Resource和@Autowired的區別
1.spring中自動註解需要配置標籤<context:component-scan> 配置完這個標籤後,spring就會去自動掃描base-package對應的路徑或者該路徑的子包下面的java檔案,如果掃描到檔案中帶有@Service,@Com
Spring的自動裝配 default-autowire="byName"
今天來整理一下Spring的自動裝配 autowire一節,在這裡我們要解決以下問題: §1 什麼是自動裝配? §2 自動裝配的意義? §3 自動裝配有幾種型別? §4 如何啟用自動裝配? §5 自動裝配將引發的問題? §1 什麼是自動裝配? Spring
spring boot學習二:Spring Boot自動裝配分析與實戰
Web application conditions:@ConditionalOnWebApplication和@ConditionalOnNotWebApplication,當專案是web專案,或者不是web專案的條件註解 SpEL expression conditions:@Conditional
Spring Autowire自動裝配
在應用中,我們常常使用<ref>標籤為JavaBean注入它依賴的物件。但是對於一個大型的系統,這個操作將會耗費我們大量的資源,我們不得不花費大量的時間和精力用於建立和維護系統中的<ref>標籤。實際上,這種方式也會在另一種形式上增加了應用程式的複雜