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

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

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

一、前言

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

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

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

2.1 注冊(cè)Bean

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

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

因?yàn)槭?strong>隱式定義方法,所以有一定的限制。比如說(shuō)在同一個(gè)包內(nèi)。

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

@Component
 
Public class AAA{
 
}

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

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

【啟動(dòng)掃描的類(lèi)名為AConfig是習(xí)慣而非規(guī)定,因?yàn)榧群虯有關(guān),又和config有關(guān)】

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

在XML文件中加入

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

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

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

因?yàn)閷⒆址付閰?shù)的時(shí)候不安全,所以有指定包中的類(lèi)來(lái)表明包的方法。將@Component中的參數(shù)換成(basePackageClass={AAA.class, BBB.class})即可掃描AAA和BBB所在的包。

單元測(cè)試時(shí)在測(cè)試類(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)對(duì)象時(shí)即可實(shí)現(xiàn)Bean的注入。

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

與不適用注解的區(qū)別在于,如果用了注入,在使用被注入的方法時(shí)無(wú)需對(duì)該方法的類(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í)不報(bào)錯(cuò),不推薦。

三、手動(dòng)裝配

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

3.1 Java類(lèi)

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

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

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

假如AAA類(lèi)要使用BBB類(lèi)的對(duì)象。就要在AConfig中加入如下方法:

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

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

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

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

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

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

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

例如:

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

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

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

@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對(duì)象,讓兩個(gè)CCC類(lèi)方法cCC()和anotherCCC()調(diào)用同一個(gè)BBB對(duì)象。

四、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對(duì)象id命名為packagename.CCC#1。即,自動(dòng)命名時(shí)號(hào)碼自增。

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

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

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

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

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

有一個(gè)引用如下

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

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

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

回歸到通用符號(hào),上例中的BBB有已經(jīng)被賦值或構(gòu)造時(shí)就被定義的屬性。如果我們需要注入一個(gè)類(lèi)BBC,且BBC在構(gòu)造時(shí)需要輸入?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>

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

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

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

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

其中BlankDisc類(lèi)構(gòu)造有title和artist兩個(gè)參數(shù),剛好對(duì)應(yīng)c:的兩個(gè)屬性。

當(dāng)然

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

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

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

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

property標(biāo)簽

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

五、導(dǎo)入配置

5.1 Java類(lèi)

若多個(gè)注冊(cè)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導(dǎo)入CConfig

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

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

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

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

六、導(dǎo)入到XML

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

<import resource="Bconfig.xml" />

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

相關(guān)文章

  • 詳解Spring Boot應(yīng)用的啟動(dòng)和停止(start啟動(dòng))

    詳解Spring Boot應(yīng)用的啟動(dòng)和停止(start啟動(dòng))

    這篇文章主要介紹了詳解Spring Boot應(yīng)用的啟動(dòng)和停止(start啟動(dòng)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • Spring MVC環(huán)境中文件上傳功能的實(shí)現(xiàn)方法詳解

    Spring MVC環(huán)境中文件上傳功能的實(shí)現(xiàn)方法詳解

    文件上傳是大家應(yīng)該都不陌生的一個(gè)功能,最近在開(kāi)發(fā)中就又遇到了這個(gè)需求,所以想著總結(jié)一下方便以后需要的時(shí)候參考,下面這篇文章主要給大家介紹了關(guān)于Spring MVC環(huán)境中文件上傳功能的實(shí)現(xiàn)方法,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-10-10
  • java分析html算法(java網(wǎng)頁(yè)蜘蛛算法示例)

    java分析html算法(java網(wǎng)頁(yè)蜘蛛算法示例)

    近來(lái)有些朋友在做蜘蛛算法,或者在網(wǎng)頁(yè)上面做深度的數(shù)據(jù)挖掘,下面使用示例
    2014-03-03
  • 淺談Maven包沖突的原理及解決方法

    淺談Maven包沖突的原理及解決方法

    這篇文章主要介紹了淺談Maven包沖突的原理及解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 關(guān)于@ApiModel和@ApiModelProperty的使用

    關(guān)于@ApiModel和@ApiModelProperty的使用

    這篇文章主要介紹了關(guān)于@ApiModel和@ApiModelProperty的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Redis緩存及熱點(diǎn)key問(wèn)題解決方案

    Redis緩存及熱點(diǎn)key問(wèn)題解決方案

    這篇文章主要介紹了Redis緩存及熱點(diǎn)key問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 用Eclipse 創(chuàng)建一個(gè)簡(jiǎn)單的web項(xiàng)目(圖文教程)

    用Eclipse 創(chuàng)建一個(gè)簡(jiǎn)單的web項(xiàng)目(圖文教程)

    下面小編就為大家?guī)?lái)一篇用Eclipse 創(chuàng)建一個(gè)簡(jiǎn)單的web項(xiàng)目(圖文教程)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • java實(shí)現(xiàn)簡(jiǎn)單的加減乘除計(jì)算器

    java實(shí)現(xiàn)簡(jiǎn)單的加減乘除計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單的加減乘除計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Springboot根據(jù)配置文件動(dòng)態(tài)注入接口實(shí)現(xiàn)類(lèi)詳解

    Springboot根據(jù)配置文件動(dòng)態(tài)注入接口實(shí)現(xiàn)類(lèi)詳解

    這篇文章主要介紹了Springboot根據(jù)配置文件動(dòng)態(tài)注入接口實(shí)現(xiàn)類(lèi)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,需要的朋友可以參考下,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • 詳解如何使用Java流API構(gòu)建樹(shù)形結(jié)構(gòu)數(shù)據(jù)

    詳解如何使用Java流API構(gòu)建樹(shù)形結(jié)構(gòu)數(shù)據(jù)

    在實(shí)際開(kāi)發(fā)中,構(gòu)建樹(shù)狀層次結(jié)構(gòu)是常見(jiàn)需求,本文主要為大家詳細(xì)介紹了如何使用Java 8 Stream API將扁平化的菜單數(shù)據(jù)轉(zhuǎn)換為具有層級(jí)關(guān)系的樹(shù)形結(jié)構(gòu),需要的可以參考下
    2024-04-04

最新評(píng)論