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

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

 更新時間:2021年05月10日 08:59:30   作者:HouraisanF  
這篇文章主要介紹了Java基礎之Bean的創(chuàng)建、定位和使用,文中有非常詳細的圖文示例及代碼,對正在學習java基礎的小伙伴們有很好地幫助,需要的朋友可以參考下

一、前言

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

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

二、自動裝配Bean

2.1 注冊Bean

為所有想要創(chuàng)建Bean的類添加@Component,即可在自動掃描開始時自動將類注冊為Bean。

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

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

比如,為AAA類添加了注解@Component

@Component
 
Public class AAA{
 
}

如果注解掃描的功能開啟,那么會自動掃描所有加了該注解的類。

但是掃描功能默認是關閉的。在與AAA類同一包內添加新的類AConfig并加上@ComponentScan即可開啟自動掃描功能,Spring將自動掃描該包內所有帶有@Component的類。而AConfig中的內容與掃描功能無關。

【啟動掃描的類名為AConfig是習慣而非規(guī)定,因為既和A有關,又和config有關】

開啟自動掃描的另一種方式:XML配置

在XML文件中加入

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

其中XXX是AAA所在的包,即可開啟對該包的自動掃描。

@ComponentScan默認掃描本包內的類注解,若想掃描其他包則需要加入?yún)?shù)basePackages="XXX",XXX是想要掃描的包。同理,想要指定多個包來掃描:@ComponentScan(basePackage={"XXX", "XX2"}),用大括號擴住所有包。其中basepackage可以省略,可以只寫包名。

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

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

自動形成的Bean的ID會和類名一致,就是首字母會變成小寫格式。如AAA類的Bean是aAA。(其余字母不是固定大寫,而是不變)

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

2.2 使用Bean

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

在使用Bean的方法上添加@Autowired,傳入有Bean的類對象時即可實現(xiàn)Bean的注入。

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

與不適用注解的區(qū)別在于,如果用了注入,在使用被注入的方法時無需對該方法的類實例化。

該程序中useAxe()方法使用到了Axe類,但是并沒有實例化Axe類。

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

Required=flase可以讓無Bean時不報錯,不推薦。

三、手動裝配

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

3.1 Java類

因為自動裝配需要在源碼的類上加注解,所以Java類注解法適用于無法修改源碼的情況。

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

使用@Bean注解來生成Bean

假如AAA類要使用BBB類的對象。就要在AConfig中加入如下方法:

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

根據(jù)習慣,這個方法的名字和所需要引用的類一致來表名引用的時哪個類,只是首字母會變成小寫。

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

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

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

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

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

例如:

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

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

那么會出現(xiàn)多個CCC類實例同時調用同一個BBB的現(xiàn)象。

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

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

四、XML文件

在XML文件中寫一個<Bean>即可生成Bean

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

如果不指定id則id會自動變成packagename.CCC#0,再引用packagename.CCC類時會將新的Bean對象id命名為packagename.CCC#1。即,自動命名時號碼自增。

spring在發(fā)現(xiàn)<Bean>時,會自動執(zhí)行類的構造方法來生成實例注冊成Bean。

如果需要聲明一個引用BBB的CCC

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

其中bBB是一個BBB類的Bean,由此講該Bean注入到CCC。

<constructor>標簽可以用c命名空間來做一些簡寫。舉一些具體的例子:

有一個引用如下

這個標簽向CDPlayer類中注入了compactDisc,用c命名空間來代替<constructor>標簽

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

只有一個構造方法時也可以省略代號

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

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

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

賦值的操作也可以用c命名空間來簡化,用上面的具體例子來說明:

用<constructor>標簽在聲明引用的時候給BlankDisc賦了兩個值。

簡化后的c命名空間:

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

當然

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

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

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

如果不需要輸入?yún)?shù)也可以用<property>來代替<constructor>,會簡潔很多。

property標簽

第一個compact是CDPlayer的構造方法中參數(shù)的名稱,第二個compact是引用的類名。簡化后的p命名空間也是p:開頭

五、導入配置

5.1 Java類

若多個注冊Bean的方法在不同的配置類中,則可以通過@import來將BConfig引入到CConfig中

例如:若BBB有一個配置類

@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) ;
    }
}

這樣就能跨配置類使用Bean。

這種引用不是只有一對一可用。還可以定義一個新的配置類,把BConfig和CConfig都引用進去。

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

六、導入到XML

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

<import resource="Bconfig.xml" />

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

相關文章

  • javaweb servlet中使用請求轉發(fā)亂碼的實現(xiàn)

    javaweb servlet中使用請求轉發(fā)亂碼的實現(xiàn)

    下面小編就為大家?guī)硪黄猨avaweb servlet中使用請求轉發(fā)亂碼的實現(xiàn)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • 詳解如何使用SpringBoot的緩存@Cacheable

    詳解如何使用SpringBoot的緩存@Cacheable

    這篇文章主要為大家介紹了如何使用SpringBoot的緩存@Cacheable詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • Spring框架IOC容器底層原理詳解

    Spring框架IOC容器底層原理詳解

    在java當中一個類想要使用另一個類的方法,就必須在這個類當中創(chuàng)建這個類的對象,Spring將創(chuàng)建對象的權利給了IOC,在IOC當中創(chuàng)建了ABC三個對象,那么我們我們其他的類只需要調用集合,大大的解決了程序耦合性的問題
    2022-07-07
  • mybatis返回key value map集合方式

    mybatis返回key value map集合方式

    這篇文章主要介紹了mybatis返回key value map集合方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 基于Java?利用Mybatis實現(xiàn)oracle批量插入及分頁查詢

    基于Java?利用Mybatis實現(xiàn)oracle批量插入及分頁查詢

    這篇文章主要介紹了基于Java?利用Mybatis實現(xiàn)oracle批量插入及分頁查詢,文章圍繞主題展開詳細的內容介紹,需要的小伙伴可以參考一下
    2022-07-07
  • SpringBoot項目中使用Sharding-JDBC實現(xiàn)讀寫分離的詳細步驟

    SpringBoot項目中使用Sharding-JDBC實現(xiàn)讀寫分離的詳細步驟

    Sharding-JDBC是一個分布式數(shù)據(jù)庫中間件,它不僅支持數(shù)據(jù)分片,還可以輕松實現(xiàn)數(shù)據(jù)庫的讀寫分離,本文介紹如何在Spring Boot項目中集成Sharding-JDBC并實現(xiàn)讀寫分離的詳細步驟,需要的朋友可以參考下
    2024-08-08
  • 如何在Spring Boot中實現(xiàn)異步處理與并發(fā)控制

    如何在Spring Boot中實現(xiàn)異步處理與并發(fā)控制

    本文我們將深入探討如何在Spring Boot中實現(xiàn)異步處理與并發(fā)控制,這一過程涉及到異步任務的執(zhí)行、線程池的配置、以及并發(fā)控制的實踐,以幫助我們提升應用的性能和響應能力,感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • Java中Integer128的坑

    Java中Integer128的坑

    本文主要介紹了Java中Integer128的坑,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-03-03
  • Java synchronized同步方法詳解

    Java synchronized同步方法詳解

    這篇文章主要為大家詳細介紹了Java synchronized同步方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 如何在Intellij中安裝LeetCode刷題插件方便Java刷題

    如何在Intellij中安裝LeetCode刷題插件方便Java刷題

    這篇文章主要介紹了如何在Intellij中安裝LeetCode刷題插件方便Java刷題,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08

最新評論

荥经县| 青浦区| 石河子市| 民乐县| 梅河口市| 冀州市| 横峰县| 屯门区| 石首市| 马关县| 赣榆县| 杭锦后旗| 安塞县| 高阳县| 扎兰屯市| 丹东市| 迁安市| 鄂尔多斯市| 宜章县| 嫩江县| 敦煌市| 韩城市| 永兴县| 池州市| 铅山县| 沁源县| 北流市| 临高县| 冀州市| 红桥区| 呼和浩特市| 雅江县| 来凤县| 肇庆市| 桐城市| 嘉鱼县| 苍梧县| 宁波市| 博白县| 赫章县| 丹东市|