国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

Java基礎之Bean的創(chuàng )建、定位和使用

發(fā)布時(shí)間:2021-07-06 11:12 來(lái)源:腳本之家 閱讀:0 作者:HouraisanF 欄目: 開(kāi)發(fā)技術(shù)

目錄

      一、前言

      Bean是一個(gè)由Spring IoC容器實(shí)例化、組裝和管理的對象。在 Spring 中,類(lèi)的實(shí)例化、依賴(lài)的實(shí)例化、依賴(lài)的傳入都交由 Spring Bean 容器控制,而不是用new方式實(shí)例化對象、通過(guò)非構造函數方法傳入依賴(lài)等常規方式。這樣可以減少垃圾回收對大量實(shí)例的回收工作。

      在舉例中使用到了三個(gè)類(lèi)AAA,BBB和CCC。其中AAA和BBB是平等的兩個(gè)類(lèi),可以相互調用。CCC是以BBB為構造參數的類(lèi)。

      二、自動(dòng)裝配Bean

      2.1 注冊Bean

      為所有想要創(chuàng )建Bean的類(lèi)添加@Component,即可在自動(dòng)掃描開(kāi)始時(shí)自動(dòng)將類(lèi)注冊為Bean。

      掃描默認是關(guān)閉的。要打開(kāi)掃描功能,需要為包內的一個(gè)類(lèi)加上注解@ComponentScan。又因為每個(gè)項目都需要配置類(lèi),所以約定注解@ComponentScan加在配置類(lèi)上。

      因為是隱式定義方法,所以有一定的限制。比如說(shuō)在同一個(gè)包內。

      比如,為AAA類(lèi)添加了注解@Component

      @Component
       
      Public class AAA{
       
      }

      如果注解掃描的功能開(kāi)啟,那么會(huì )自動(dòng)掃描所有加了該注解的類(lèi)。

      但是掃描功能默認是關(guān)閉的。在與AAA類(lèi)同一包內添加新的類(lèi)AConfig并加上@ComponentScan即可開(kāi)啟自動(dòng)掃描功能,Spring將自動(dòng)掃描該包內所有帶有@Component的類(lèi)。而AConfig中的內容與掃描功能無(wú)關(guān)。

      【啟動(dòng)掃描的類(lèi)名為AConfig是習慣而非規定,因為既和A有關(guān),又和config有關(guān)】

      開(kāi)啟自動(dòng)掃描的另一種方式:XML配置

      在XML文件中加入

      <context : component-scan base-package="XXX">

      其中XXX是AAA所在的包,即可開(kāi)啟對該包的自動(dòng)掃描。

      @ComponentScan默認掃描本包內的類(lèi)注解,若想掃描其他包則需要加入參數basePackages="XXX",XXX是想要掃描的包。同理,想要指定多個(gè)包來(lái)掃描:@ComponentScan(basePackage={"XXX", "XX2"}),用大括號擴住所有包。其中basepackage可以省略,可以只寫(xiě)包名。

      因為將字符串指定為參數的時(shí)候不安全,所以有指定包中的類(lèi)來(lái)表明包的方法。將@Component中的參數換成(basePackageClass={AAA.class, BBB.class})即可掃描AAA和BBB所在的包。

      單元測試時(shí)在測試類(lèi)添加@ContextConfiguration(class=Aconfig.class)來(lái)指定配置類(lèi),即@ComponentScan所在的類(lèi),即可用指定配置類(lèi)管理Bean。

      自動(dòng)形成的Bean的ID會(huì )和類(lèi)名一致,就是首字母會(huì )變成小寫(xiě)格式。如AAA類(lèi)的Bean是aAA。(其余字母不是固定大寫(xiě),而是不變)

      由于Bean的ID是由@Component生成的,所以在@Component中可以指定Bean的ID。@Component(”IDofA“)這樣就能將AAA類(lèi)的Bean的ID指定為IDofA

      2.2 使用Bean

      創(chuàng )建好Bean之后需要使用Bean

      在使用Bean的方法上添加@Autowired,傳入有Bean的類(lèi)對象時(shí)即可實(shí)現Bean的注入。

      在演示中發(fā)現,即使有注入,也要有參數傳入

      與不適用注解的區別在于,如果用了注入,在使用被注入的方法時(shí)無(wú)需對該方法的類(lèi)實(shí)例化。

      該程序中useAxe()方法使用到了Axe類(lèi),但是并沒(méi)有實(shí)例化Axe類(lèi)。

      這里使用@Autowired,效果是使用player.play()的時(shí)候無(wú)需實(shí)例化plyaer

      Required=flase可以讓無(wú)Bean時(shí)不報錯,不推薦。

      三、手動(dòng)裝配

      使用帶有注解的Java類(lèi)或在XML文件內顯式地聲明Bean的注冊和注入。

      3.1 Java類(lèi)

      因為自動(dòng)裝配需要在源碼的類(lèi)上加注解,所以Java類(lèi)注解法適用于無(wú)法修改源碼的情況。

      分為兩步:生成Bean和注入Bean

      使用@Bean注解來(lái)生成Bean

      假如AAA類(lèi)要使用BBB類(lèi)的對象。就要在A(yíng)Config中加入如下方法:

      @Bean
       
      public BB bBB(){
       
          return new BBB();
       
      }

      根據習慣,這個(gè)方法的名字和所需要引用的類(lèi)一致來(lái)表名引用的時(shí)哪個(gè)類(lèi),只是首字母會(huì )變成小寫(xiě)。

      @Bean會(huì )告訴spring這個(gè)方法將會(huì )返回一個(gè)對象,spring會(huì )將這個(gè)對象注冊為Bean。默認情況下Bean的ID和配置中的方法同名,也可以用@Bean的name參數來(lái)修改。

      @Bean(name="IDofB")
       
      public BBB bBB(){
       
          return new BBB();
       
      }

      在配置方法中,實(shí)現了BB接口的類(lèi)BBC和BBD都可以作為返回的對象被注冊成Bean。

      @Bean
       
      public BB otherBB(){
          If(num>10)
              return new BBC();
          Else
              return new BBD();
      }
      

      由此,可以在配置方法中返回不同的對象,只要有返回就能被注冊成Bean。相對的,一個(gè)@Bean可以根據情況返回多個(gè)Bean實(shí)例中的一個(gè),也會(huì )出現一種可能,多個(gè)@Bean各自滿(mǎn)足條件返回了同一個(gè)Bean實(shí)例。

      例如:

      假設一個(gè)類(lèi)CCC在實(shí)例化時(shí)需要一個(gè)BBB作為參數,及構造函數為

      CCC(BBB){
       
          This.bbb=BBB;
       
      }

      那么會(huì )出現多個(gè)CCC類(lèi)實(shí)例同時(shí)調用同一個(gè)BBB的現象。

      @Bean
      public CCC cCC(){
       
          return new CCC(BBB());
      }
       
       
      @Bean
      public CCC anotherCCC(){
       
          return new CCC(BBB());
      }

      以上兩個(gè)方法都返回了同一個(gè)實(shí)例,即new CCC(BBB())。這時(shí)spring會(huì )攔截第二個(gè)BBB()產(chǎn)生的BBB對象,讓兩個(gè)CCC類(lèi)方法cCC()和anotherCCC()調用同一個(gè)BBB對象。

      四、XML文件

      在XML文件中寫(xiě)一個(gè)<Bean>即可生成Bean

      <Bean id="IDofCCC" class="packagename.CCC">

      如果不指定id則id會(huì )自動(dòng)變成packagename.CCC#0,再引用packagename.CCC類(lèi)時(shí)會(huì )將新的Bean對象id命名為packagename.CCC#1。即,自動(dòng)命名時(shí)號碼自增。

      spring在發(fā)現<Bean>時(shí),會(huì )自動(dòng)執行類(lèi)的構造方法來(lái)生成實(shí)例注冊成Bean。

      如果需要聲明一個(gè)引用BBB的CCC

      <Bean id="IDofCCC" class="packagename.CCC">
          <constructor-arg ref="bBB" />
      </Bean>

      其中bBB是一個(gè)BBB類(lèi)的Bean,由此講該Bean注入到CCC。

      <constructor>標簽可以用c命名空間來(lái)做一些簡(jiǎn)寫(xiě)。舉一些具體的例子:

      有一個(gè)引用如下

      這個(gè)標簽向CDPlayer類(lèi)中注入了compactDisc,用c命名空間來(lái)代替<constructor>標簽

      其中,cd-ref中的cd是CDPlayer的構造方法的參數。在調試和封裝中,將代碼中的參數放在XML中不安全。所以可以用代號來(lái)代替參數cd。

      只有一個(gè)構造方法時(shí)也可以省略代號

      回歸到通用符號,上例中的BBB有已經(jīng)被賦值或構造時(shí)就被定義的屬性。如果我們需要注入一個(gè)類(lèi)BBC,且BBC在構造時(shí)需要輸入參數,則可以在<constructor-arg>中輸入參數。

      <Bean id="IDofCCC" class="packagename.CCC">
       
          <constructor-arg value="vob1" />
          <constructor-arg value="vob2" />
          <constructor-arg value="vob3" />
       
      </Bean>
      

      此例的意義是:需要生成一個(gè)CCC類(lèi)的Bean,且在構造CCC的時(shí)候需要三個(gè)參數。在<constructor-arg />中使用value來(lái)以此指定三個(gè)參數。

      賦值的操作也可以用c命名空間來(lái)簡(jiǎn)化,用上面的具體例子來(lái)說(shuō)明:

      用<constructor>標簽在聲明引用的時(shí)候給BlankDisc賦了兩個(gè)值。

      簡(jiǎn)化后的c命名空間:

      其中BlankDisc類(lèi)構造有title和artist兩個(gè)參數,剛好對應c:的兩個(gè)屬性。

      當然

      既然標簽都可以不用命名就能賦值,c命名空間也可以。

      將屬性名的位置排號也能實(shí)現依次賦值的作用。

      若屬性只有一個(gè),則連排號也能省略。

      如果不需要輸入參數也可以用<property>來(lái)代替<constructor>,會(huì )簡(jiǎn)潔很多。

      property標簽

      第一個(gè)compact是CDPlayer的構造方法中參數的名稱(chēng),第二個(gè)compact是引用的類(lèi)名。簡(jiǎn)化后的p命名空間也是p:開(kāi)頭

      五、導入配置

      5.1 Java類(lèi)

      若多個(gè)注冊Bean的方法在不同的配置類(lèi)中,則可以通過(guò)@import來(lái)將BConfig引入到CConfig中

      例如:若BBB有一個(gè)配置類(lèi)

      @Configuration
      public class BConfig {
          @Bean
          public BBB bBB( ) {
       
              return new BBB ( ) ;
          }
      }

      將BBB導入CConfig

      @Configuration
      @import(BConfig.class)
      public class CConfig {
          @Bean
          public CCC cCC(BBB bBB) {
       
              return new CCC (bBB) ;
          }
      }

      這樣就能跨配置類(lèi)使用Bean。

      這種引用不是只有一對一可用。還可以定義一個(gè)新的配置類(lèi),把BConfig和CConfig都引用進(jìn)去。

      以上是導入用配置類(lèi)生成的Bean。若要導入XML配置的Bean則需要@importResource。為配置類(lèi)加上注解@importResource("classpath:Bconfig.xml")

      六、導入到XML

      同理,使用<import>標簽也可以實(shí)現向XML文件中導入其他的XML文件。

      <import resource="Bconfig.xml" />

      到此這篇關(guān)于Java基礎之Bean的創(chuàng )建、定位和使用的文章就介紹到這了,更多相關(guān)Bean的創(chuàng )建、定位和使用內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

      免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。

      Bea
      国产精品28P| 亚洲精品国产电影| 日韩亚洲AV人人夜夜澡人人爽| 久久久久成人片免费观看| 国产午夜亚洲精品不卡在线观看| 久久精品噜噜噜成人AV |