1. 程式人生 > >Spring中自動裝配

Spring中自動裝配

Spring中自動裝配

Spring中有四種自動裝配型別,分別為:byNamebyTypeconstructorautodetect下面來分別介紹一下這些是如何自動裝配的

   <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

cn.csdn.hr.dao.CustomersDaoImpl;

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 屬性名與beanid名稱的名稱相同會自動裝配。

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>標籤。實際上,這種方式也會在另一種形式上增加了應用程式的複雜