欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

spring定義和裝配bean詳解

 更新時(shí)間:2017年12月05日 11:10:28   作者:kite___  
這篇文章主要介紹了spring定義和裝配bean詳解,具有一定參考價(jià)值,需要的朋友可以了解下。

在閱讀本文之前,大家可先參閱簡(jiǎn)單理解Spring之IOC和AOP及代碼示例一文,了解下Spring中IOC和AOP的相關(guān)內(nèi)容。下面進(jìn)入正題。本篇文章介紹在Spring中如何定義和裝載Java Bean。

業(yè)務(wù)場(chǎng)景

還是人開車的例子。首先,定義一個(gè)Car接口和兩個(gè)實(shí)現(xiàn)了Benz和BMW,然后定義一個(gè)Person類,Person類依賴Car接口。

public interface Car {
  void go();
}
public class Benz implements Car {
  public void go() {
    System.out.println("benz go......");
  }
}
public class BMW implements Car {
  public void go() {
    System.out.println("bmw go......");
  }
}
public class Person {
  String name = "";

  Car car = null;
  public Car getCar() {
    return car;
  }

  public void setCar(Car car) {
    this.car = car;
  }

  public Person(String name) {
    this.name=name;
  }

  public void Drive(){
    System.out.println(name+" is driving ...");
    car.go();
  }
}

在Person類中我們可以看到,car對(duì)象是該類的依賴對(duì)象,需要通過(guò)構(gòu)造方法注入到Person類中。以上的代碼還完全沒有Spring的影子,下面看看Spring是如何來(lái)注入

添加Spring依賴

現(xiàn)在很多項(xiàng)目都適用maven來(lái)管理依賴,本項(xiàng)目也是如此。我在pom.xml中加入一下依賴節(jié)點(diǎn)

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-core</artifactId>
  <version>3.2.6.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-beans</artifactId>
  <version>3.2.6.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>3.2.6.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context-support</artifactId>
  <version>3.2.6.RELEASE</version>
</dependency>

將這些dependency節(jié)點(diǎn)放入pom.xml文件的dependencies節(jié)點(diǎn)下,eclipse會(huì)自動(dòng)下載相關(guān)的包到默認(rèn)位置。

手動(dòng)定義和裝配Bean

在項(xiàng)目的根目錄中新建一個(gè)名叫bean.xml的xml文件,內(nèi)容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
  <bean id="car" class="org.zdk.springProj1.BMW" />
  <bean id="tom" class="org.zdk.springProj1.Person">
    <constructor-arg value="Tom" />
    <property name="car" ref="car" />
  </bean>
</beans>

上面的XML文件首先定義了一個(gè)id為car的bean,又定義了一個(gè)id為tom的bean,car作為tom的依賴,通過(guò)<property name="car" ref="car" />的方式被手動(dòng)地裝配到了tom的car屬性中。

創(chuàng)建應(yīng)用對(duì)象之間協(xié)作關(guān)系的行為被稱為裝配(wiring),這也是依賴對(duì)象注入的本質(zhì)。
接下來(lái)我們?cè)趍ain方法中實(shí)例化一個(gè)應(yīng)用上下文對(duì)象,并獲取bean中的tom節(jié)點(diǎn)

public class App 
{
  public static void main( String[] args )
  {
    ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
    Person tom=(Person) context.getBean("tom");
    tom.Drive();
  }
}

運(yùn)行程序,輸出結(jié)果為:

Tom is driving ...
bmw go......

自動(dòng)裝配

再重復(fù)一遍,創(chuàng)建應(yīng)用對(duì)象之間協(xié)作關(guān)系的行為被稱為裝配(wiring),而不是實(shí)例化對(duì)象的過(guò)程。在上面的xml文件中,我通過(guò)<property name="car" ref="car" />的方式來(lái)裝配了依賴對(duì)象,但是隨著應(yīng)用的不斷發(fā)展,xml配置文件肯定會(huì)越來(lái)越復(fù)雜,我們通過(guò)ref="car"來(lái)關(guān)聯(lián)id為car的bean的這種方式已經(jīng)開始落后了。下面我來(lái)介紹一下Spring如何實(shí)現(xiàn)自動(dòng)裝配bean。

自動(dòng)裝配的類型

Spring共四種裝配策略,為了降低本文的復(fù)雜性,我介紹兩種常用的策略,byName方式和byType方式。顧名思義,byName方式就是看屬性的名字和bean的id是否相同,在本例中,Person類有一個(gè)名叫car的屬性,如果將該類或改屬性設(shè)置為自動(dòng)裝配且裝配策略為byName的話,Spring會(huì)去找id為car(必須是同名)的bean。byType方式是比較類型是否相同。就本例而言,如果將Person類或Person類的car屬性設(shè)置為自動(dòng)裝配且裝配策略為byType的話,由于car屬性是Car類型,所以,Spring在進(jìn)行自動(dòng)裝配時(shí),會(huì)去找類型為Car或其子類的bean。

使用XML實(shí)現(xiàn)自動(dòng)裝配

下面我來(lái)修改代碼,使用xml配置的方式來(lái)實(shí)現(xiàn)自動(dòng)裝配。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
  <bean id="car" class="org.zdk.springProj1.BMW" />
  <bean id="tom" class="org.zdk.springProj1.Person" autowire="byName">
    <constructor-arg value="Tom" />
  </bean>
</beans>

Person類無(wú)需做任何修改。

首先,我去掉了<propertyname="car"ref="car"/>這行代碼,因?yàn)樗鞘止さ姆绞健H缓?,我將id為tom的bean增加一個(gè)屬性autowire="byName",將其設(shè)置為通過(guò)名字自動(dòng)裝配依賴,在獲取Person對(duì)象時(shí),Person的所有屬性名稱就都有了特殊的含義。Spring監(jiān)測(cè)到了Person類又一個(gè)名叫car的屬性,并且在配置文件中發(fā)現(xiàn)了一個(gè)id為car的bean,于是乎,就將其自動(dòng)裝配給了Person的car屬性。

通過(guò)注解實(shí)現(xiàn)自動(dòng)裝配

我們將bean.xml做如下修改

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-autowire="byName">
  <bean id="car" class="org.zdk.springProj1.BMW" />
  <bean id="tom" class="org.zdk.springProj1.Person">
    <constructor-arg value="Tom" />
  </bean>
</beans>

將id為tom的bean的一個(gè)屬性autowire="byName"刪除,然后在跟節(jié)點(diǎn)beans中添加一個(gè)屬性default-autowire="byName"來(lái)設(shè)置該文件內(nèi)定義的所有bean的自動(dòng)裝配方式的默認(rèn)值為byName。然后對(duì)Person 類做一點(diǎn)修改,在car的setter方法上加上@Autowired注解,來(lái)通知Spring對(duì)該屬性進(jìn)行自動(dòng)裝配。重新運(yùn)行代碼,輸出結(jié)果不變。

@Autowired
public void setCar(Car car) {
  this.car = car;
}

通過(guò)注解來(lái)實(shí)現(xiàn)自動(dòng)裝配的話,需要首先在beans根目錄上制定默認(rèn)的自動(dòng)裝配方式,然后就不需要在配置文件中為每一個(gè)需要自動(dòng)裝配的bean來(lái)配置autowire屬性了(如果方式與默認(rèn)的不一致,仍然可以單獨(dú)配置,來(lái)覆蓋默認(rèn)的自動(dòng)裝配方式)。注解的方式更加細(xì)膩,它可以對(duì)需要自動(dòng)裝配的bean達(dá)到屬性級(jí)的控制。

在上面的所有代碼中,我們?cè)谂渲梦募卸际鞘褂玫膐rg.zdk.springProj1.BMW類作為Person類的依賴,如果由于業(yè)務(wù)需要,Person類不需要開寶馬車而改開奔馳車了,只需要將該配置修改為org.zdk.springProj1.Benz即可,無(wú)需修改任何Java代碼,這就是Spring作為IOC容器的強(qiáng)大之處。

總結(jié)

以上就是本文關(guān)于spring定義和裝配bean詳解的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:

Java之Spring注解配置bean實(shí)例代碼解析

Spring配置使用之Bean生命周期詳解

如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!

相關(guān)文章

  • 剖析Java中的事件處理與異常處理機(jī)制

    剖析Java中的事件處理與異常處理機(jī)制

    這篇文章主要介紹了Java中的事件處理與異常處理機(jī)制,講解Java是如何對(duì)事件或者異常作出響應(yīng)以及定義異常的一些方法,需要的朋友可以參考下
    2016-01-01
  • Java中小球碰撞并使用按鈕控制數(shù)量實(shí)例代碼

    Java中小球碰撞并使用按鈕控制數(shù)量實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于Java中小球碰撞并使用按鈕控制數(shù)量的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-12-12
  • Spring Boot和Thymeleaf整合結(jié)合JPA實(shí)現(xiàn)分頁(yè)效果(實(shí)例代碼)

    Spring Boot和Thymeleaf整合結(jié)合JPA實(shí)現(xiàn)分頁(yè)效果(實(shí)例代碼)

    這篇文章主要介紹了Spring Boot和Thymeleaf整合結(jié)合JPA實(shí)現(xiàn)分頁(yè)效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • 舉例講解設(shè)計(jì)模式中的訪問者模式在Java編程中的運(yùn)用

    舉例講解設(shè)計(jì)模式中的訪問者模式在Java編程中的運(yùn)用

    這篇文章主要介紹了舉例講解設(shè)計(jì)模式中的訪問者模式在Java編程中的運(yùn)用,訪問者模式是一種將算法與對(duì)象結(jié)構(gòu)分離的軟件設(shè)計(jì)模式,需要的朋友可以參考下
    2016-05-05
  • Java、C++中子類對(duì)父類函數(shù)覆蓋的可訪問性縮小的區(qū)別介紹

    Java、C++中子類對(duì)父類函數(shù)覆蓋的可訪問性縮小的區(qū)別介紹

    這篇文章主要給大家介紹了關(guān)于Java、C++中子類對(duì)父類函數(shù)覆蓋的可訪問性縮小的區(qū)別的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • Java實(shí)現(xiàn)簡(jiǎn)單的彈球游戲

    Java實(shí)現(xiàn)簡(jiǎn)單的彈球游戲

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單的彈球游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • @SpringBootConfiguration重復(fù)加載報(bào)錯(cuò)問題解決

    @SpringBootConfiguration重復(fù)加載報(bào)錯(cuò)問題解決

    @SpringBootApplication?注解的?exclude?屬性用于排除特定的自動(dòng)配置類,而不是用于排除主配置類本身,因此,不能通過(guò)?exclude?屬性來(lái)排除主配置類的加載,這篇文章主要介紹了@SpringBootConfiguration重復(fù)加載報(bào)錯(cuò),需要的朋友可以參考下
    2024-08-08
  • 簡(jiǎn)單了解Java程序運(yùn)行整體流程

    簡(jiǎn)單了解Java程序運(yùn)行整體流程

    這篇文章主要介紹了簡(jiǎn)單了解Java程序運(yùn)行整體流程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • MVC頁(yè)面之間參數(shù)傳遞實(shí)現(xiàn)過(guò)程圖解

    MVC頁(yè)面之間參數(shù)傳遞實(shí)現(xiàn)過(guò)程圖解

    這篇文章主要介紹了MVC頁(yè)面之間參數(shù)傳遞實(shí)現(xiàn)過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • tk.mybatis實(shí)現(xiàn)uuid主鍵生成的示例代碼

    tk.mybatis實(shí)現(xiàn)uuid主鍵生成的示例代碼

    本文主要介紹了tk.mybatis實(shí)現(xiàn)uuid主鍵生成的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12

最新評(píng)論