最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring定義和裝配bean詳解

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

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

業(yè)務(wù)場景

還是人開車的例子。首先,定義一個Car接口和兩個實現(xiàn)了Benz和BMW,然后定義一個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對象是該類的依賴對象,需要通過構(gòu)造方法注入到Person類中。以上的代碼還完全沒有Spring的影子,下面看看Spring是如何來注入

添加Spring依賴

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

<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é)點放入pom.xml文件的dependencies節(jié)點下,eclipse會自動下載相關(guān)的包到默認(rèn)位置。

手動定義和裝配Bean

在項目的根目錄中新建一個名叫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文件首先定義了一個id為car的bean,又定義了一個id為tom的bean,car作為tom的依賴,通過<property name="car" ref="car" />的方式被手動地裝配到了tom的car屬性中。

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

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

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

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

自動裝配

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

自動裝配的類型

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

使用XML實現(xiàn)自動裝配

下面我來修改代碼,使用xml配置的方式來實現(xiàn)自動裝配。

<?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類無需做任何修改。

首先,我去掉了<propertyname="car"ref="car"/>這行代碼,因為它是手工的方式。然后,我將id為tom的bean增加一個屬性autowire="byName",將其設(shè)置為通過名字自動裝配依賴,在獲取Person對象時,Person的所有屬性名稱就都有了特殊的含義。Spring監(jiān)測到了Person類又一個名叫car的屬性,并且在配置文件中發(fā)現(xiàn)了一個id為car的bean,于是乎,就將其自動裝配給了Person的car屬性。

通過注解實現(xiàn)自動裝配

我們將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的一個屬性autowire="byName"刪除,然后在跟節(jié)點beans中添加一個屬性default-autowire="byName"來設(shè)置該文件內(nèi)定義的所有bean的自動裝配方式的默認(rèn)值為byName。然后對Person 類做一點修改,在car的setter方法上加上@Autowired注解,來通知Spring對該屬性進行自動裝配。重新運行代碼,輸出結(jié)果不變。

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

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

在上面的所有代碼中,我們在配置文件中都是使用的org.zdk.springProj1.BMW類作為Person類的依賴,如果由于業(yè)務(wù)需要,Person類不需要開寶馬車而改開奔馳車了,只需要將該配置修改為org.zdk.springProj1.Benz即可,無需修改任何Java代碼,這就是Spring作為IOC容器的強大之處。

總結(jié)

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

Java之Spring注解配置bean實例代碼解析

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

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

相關(guān)文章

  • 基于Java實現(xiàn)音樂播放器的示例代碼

    基于Java實現(xiàn)音樂播放器的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Java編寫一個簡單的音樂播放器,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解一下
    2023-07-07
  • Java實現(xiàn)文件上傳的方法

    Java實現(xiàn)文件上傳的方法

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)文件上傳的方法,供大家參考,感興趣的朋友可以參考一下
    2016-05-05
  • Spring Boot啟動過程(五)之Springboot內(nèi)嵌Tomcat對象的start教程詳解

    Spring Boot啟動過程(五)之Springboot內(nèi)嵌Tomcat對象的start教程詳解

    這篇文章主要介紹了Spring Boot啟動過程(五)之Springboot內(nèi)嵌Tomcat對象的start的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Java使用JDBC或MyBatis框架向Oracle中插入XMLType數(shù)據(jù)

    Java使用JDBC或MyBatis框架向Oracle中插入XMLType數(shù)據(jù)

    XMLType是Oracle支持的一種基于XML格式存儲的數(shù)據(jù)類型,這里我們共同來探究Java使用JDBC或MyBatis框架向Oracle中插入XMLType數(shù)據(jù)的方法:
    2016-07-07
  • Java中的WeakHashMap簡析

    Java中的WeakHashMap簡析

    這篇文章主要介紹了Java中的WeakHashMap簡析,Map 的子類常見的有 HashMap、Hashtable、ConcurrentHashMap、LinkedHashMap 等,WeakHashMap,直譯就是,虛弱的 HashMap,從名字可得知其和 HashMap 有關(guān),需要的朋友可以參考下
    2023-09-09
  • 詳解Java synchronized關(guān)鍵字的用法

    詳解Java synchronized關(guān)鍵字的用法

    在多線程編程中常常使用鎖機制來確保同一時刻只有一個線程能夠修改共享內(nèi)存,在Java中一般是使用synchronized作為鎖機制,下面就讓我們來學(xué)習(xí)一下如何使用synchronized實現(xiàn)線程安全吧
    2023-08-08
  • java中Base64編碼原理實例講解

    java中Base64編碼原理實例講解

    這篇文章主要介紹了java中Base64編碼原理實例講解,文章講解的很清晰,有對于這方面不太懂的同學(xué)可以研究下
    2021-02-02
  • springboot實現(xiàn)簡單的消息對話的示例代碼

    springboot實現(xiàn)簡單的消息對話的示例代碼

    本文主要介紹了springboot實現(xiàn)簡單的消息對話的示例代碼,可以使用WebSocket技術(shù),WebSocket是一種在客戶端和服務(wù)器之間提供實時雙向通信的協(xié)議,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • 詳解如何判斷Java線程池任務(wù)已執(zhí)行完

    詳解如何判斷Java線程池任務(wù)已執(zhí)行完

    線程池的使用并不復(fù)雜,麻煩的是如何判斷線程池中的任務(wù)已經(jīng)全部執(zhí)行完了,所以接下來,我們就來看看如何判斷線程中的任務(wù)是否已經(jīng)全部執(zhí)行完吧
    2023-08-08
  • Java 9中如何對IntegerCache進行修改詳解

    Java 9中如何對IntegerCache進行修改詳解

    這篇文章主要給大家介紹了關(guān)于Java 9中如何對IntegerCache進行修改的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或使用java9具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起看看吧。
    2017-12-12

最新評論

赤壁市| 如皋市| 太康县| 柳河县| 鄂伦春自治旗| 台北市| 云安县| 南宫市| 浏阳市| 兴业县| 桦甸市| 麟游县| 微博| 宜城市| 柳河县| 灌阳县| 名山县| 蒙城县| 泸西县| 山东省| 舒兰市| 东港市| 平顶山市| 晴隆县| 平山县| 胶州市| 莎车县| 监利县| 定陶县| 达孜县| 含山县| 太仆寺旗| 固安县| 菏泽市| 泗洪县| 比如县| 万全县| 金门县| 万山特区| 沭阳县| 探索|