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

深入解析Spring中的@Bean注解

 更新時間:2023年07月21日 10:57:54   作者:Java知音_  
這篇文章主要介紹了深入解析Spring中的@Bean注解,Spring的@Bean注解用于告訴方法,產(chǎn)生一個Bean對象,然后這個Bean對象交給Spring管理,產(chǎn)生這個Bean對象的方法Spring只會調(diào)用一次,隨后這個Spring將會將這個Bean對象放在自己的IOC容器中,需要的朋友可以參考下

@Bean 基礎(chǔ)概念

隨著SpringBoot的流行,我們現(xiàn)在更多采用基于注解式的配置從而替換掉了基于XML的配置,所以本篇文章我們主要探討基于注解的@Bean以及和其他注解的使用;

  • @Bean:Spring的@Bean注解用于告訴方法,產(chǎn)生一個Bean對象,然后這個Bean對象交給Spring管理。產(chǎn)生這個Bean對象的方法Spring只會調(diào)用一次,隨后這個Spring將會將這個Bean對象放在自己的IOC容器中;
  • SpringIOC 容器管理一個或者多個bean,這些bean都需要在@Configuration注解下進(jìn)行創(chuàng)建,在一個方法上使用@Bean注解就表明這個方法需要交給Spring進(jìn)行管理;
  • @Bean是一個方法級別上的注解,主要用在@Configuration注解的類里,也可以用在@Component注解的類里。添加的bean的id為方法名;
  • 使用Bean時,即是把已經(jīng)在xml文件中配置好的Bean拿來用,完成屬性、方法的組裝;比如@Autowired , @Resource,可以通過byTYPE(@Autowired)、byNAME(@Resource)的方式獲取Bean;
  • 注冊Bean時,@Component , @Repository , @ Controller , @Service , @Configration這些注解都是把你要實(shí)例化的對象轉(zhuǎn)化成一個Bean,放在IoC容器中,等你要用的時候,它會和上面的@Autowired , @Resource配合到一起,把對象、屬性、方法完美組裝;
  • @Configuration與@Bean結(jié)合使用:@Configuration可理解為用spring的時候xml里面的標(biāo)簽,@Bean可理解為用spring的時候xml里面的標(biāo)簽;

快速搭建一個maven項(xiàng)目并配置好所需要的Spring 依賴

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

在src根目錄下創(chuàng)建一個AppConfig的配置類,這個配置類也就是管理一個或多個bean 的配置類,并在其內(nèi)部聲明一個myBean的bean,并創(chuàng)建其對應(yīng)的實(shí)體類

@Configuration
public class AppConfig {
    // 使用@Bean 注解表明myBean需要交給Spring進(jìn)行管理
    // 未指定bean 的名稱,默認(rèn)采用的是 "方法名" + "首字母小寫"的配置方式
    @Bean
    public MyBean myBean(){
        return new MyBean();
    }
}
public class MyBean {
    public MyBean(){
        System.out.println("MyBean Initializing");
    }
}

然后再創(chuàng)建一個測試類SpringBeanApplicationTests,測試上述代碼的正確性

public class SpringBeanApplicationTests {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        context.getBean("myBean");
    }
}

輸出 : MyBean Initializing

深入了解@Bean注解的源代碼

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Bean {
    @AliasFor("name")
    String[] value() default {};
    @AliasFor("value")
    String[] name() default {};
    Autowire autowire() default Autowire.NO;
    String initMethod() default "";
    String destroyMethod() default AbstractBeanDefinition.INFER_METHOD;
}

@Bean的屬性:

  • value:bean別名和name是相互依賴關(guān)聯(lián)的,value,name如果都使用的話值必須要一致;
  • name:bean名稱,如果不寫會默認(rèn)為注解的方法名稱;
  • autowire:自定裝配默認(rèn)是不開啟的,建議盡量不要開啟,因?yàn)樽詣友b配不能裝配基本數(shù)據(jù)類型、字符串、數(shù)組等,這是自動裝配設(shè)計(jì)的局限性,并且自動裝配不如依賴注入精確;
  • initMethod:bean的初始化之前的執(zhí)行方法,該參數(shù)一般不怎么用,因?yàn)橥耆梢栽诖a中實(shí)現(xiàn);
  • destroyMethod:默認(rèn)使用javaConfig配置的bean,如果存在close或者shutdown方法,則在bean銷毀時會自動執(zhí)行該方法,如果你不想執(zhí)行該方法,則添加@Bean(destroyMethod="")來防止出發(fā)銷毀方法;

如果發(fā)現(xiàn)銷毀方法沒有執(zhí)行,原因是bean銷魂之前程序已經(jīng)結(jié)束了,可以手動close下如下:

AnnotationConfigApplicationContext applicationContext2 = new AnnotationConfigApplicationContext(MainConfig.class);
User bean2 = applicationContext2.getBean(User.class);
System.out.println(bean2);
//手動執(zhí)行close方法
applicationContext2.close();

運(yùn)行結(jié)果如下:

初始化用戶bean之前執(zhí)行
User [userName=張三, age=26]
bean銷毀之后執(zhí)行

我們發(fā)現(xiàn)@baen注解的@Target是ElementType.METHOD,ElementType.ANNOTATION_TYPE也就說@Bean注解可以在使用在方法上,以及一個注釋類型聲明

@Bean 注解與其他注解一起使用

@Bean注解不止這幾個屬性,它還能和其他的注解一起配合使用,請繼續(xù)往下看:

@Profile 注解

@Profile的作用是把一些meta-data進(jìn)行分類,分成Active和InActive這兩種狀態(tài),然后你可以選擇在active 和在Inactive這兩種狀態(tài)下配置bean,在Inactive狀態(tài)通常的注解有一個!操作符,通常寫為:@Profile("!p"),這里的p是Profile的名字。

三種設(shè)置方式:

  • 可以通過ConfigurableEnvironment.setActiveProfiles()以編程的方式激活。
  • 可以通過AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME (spring.profiles.active )屬性設(shè)置為JVM屬性。
  • 作為環(huán)境變量,或作為web.xml 應(yīng)用程序的Servlet 上下文參數(shù)。也可以通過@ActiveProfiles 注解在集成測試中以聲明方式激活配置文件。

作用域:

  • 作為類級別的注解在任意類或者直接與@Component 進(jìn)行關(guān)聯(lián),包括@Configuration 類
  • 作為原注解,可以自定義注解
  • 作為方法的注解作用在任何方法

注意:

  • 如果一個配置類使用了Profile 標(biāo)簽或者@Profile 作用在任何類中都必須進(jìn)行啟用才會生效,如果@Profile({“p1”,"!p2"}) 標(biāo)識兩個屬性,那么p1 是啟用狀態(tài) 而p2 是非啟用狀態(tài)的。

例如:

@Profile("dev")
public @Bean("activityMongoFactory")
MongoDbFactory activityMongoFactoryDev(MongoClient activityMongo) {
    return new SimpleMongoDbFactory(activityMongo, stringValueResolver.resolveStringValue("${mongodb.dev.database}"));
}

@Scope 注解

在Spring中對于bean的默認(rèn)處理都是單例的,我們通過上下文容器.getBean方法拿到bean容器,并對其進(jìn)行實(shí)例化,這個實(shí)例化的過程其實(shí)只進(jìn)行一次,即多次getBean 獲取的對象都是同一個對象,也就相當(dāng)于這個bean的實(shí)例在IOC容器中是public的,對于所有的bean請求來講都可以共享此bean。

如果我們不想把這個bean被所有的請求共享或者說每次調(diào)用我都想讓它生成一個新的bean實(shí)例,該怎么實(shí)現(xiàn)呢?

bean的多個實(shí)例

bean的非單例原型范圍會使每次發(fā)出對該特定bean的請求時都創(chuàng)建新的bean實(shí)例,也就是說,bean被注入另一個bean,或者通過對容器的getBean()方法調(diào)用來請求它。

下面,我們通過一個示例來說明bean的多個實(shí)例

新建一個ConfigScope配置類,用來定義多例的bean

@Configuration
public class ConfigScope {
    /**
     * 為myBean起兩個名字,b1 和 b2
     * @Scope 默認(rèn)為 singleton,但是可以指定其作用域
     * prototype 是多例的,即每一次調(diào)用都會生成一個新的實(shí)例。
     */
    @Bean({"b1","b2"})
    @Scope("prototype")
    public MyBean myBean(){
        return new MyBean();
    }
}

注意:prototype代表bean對象的定義為任意數(shù)量的對象實(shí)例,所以指定為prototype屬性可以定義為多例,也會每一次調(diào)用都會生成一個新的實(shí)例。

singleton和prototype 一般都用在普通的Java項(xiàng)目中,而request、session、application、websocket都用于web應(yīng)用中。

@Lazy 注解

表明一個bean 是否延遲加載,可以作用在方法上,表示這個方法被延遲加載;可以作用在@Component (或者由@Component 作為原注解) 注釋的類上,表明這個類中所有的bean 都被延遲加載。

如果沒有@Lazy注釋,或者@Lazy 被設(shè)置為false,那么該bean 就會急切渴望被加載;除了上面兩種作用域,@Lazy 還可以作用在@Autowired和@Inject注釋的屬性上,在這種情況下,它將為該字段創(chuàng)建一個惰性代理,作為使用ObjectFactory或Provider的默認(rèn)方法。

下面來演示一下:

@Lazy
@Configuration
@ComponentScan(basePackages = "com.spring.configuration.pojo")
public class AppConfigWithLazy {
    @Bean
    public MyBean myBean(){
        System.out.println("myBean Initialized");
        return new MyBean();
    }
    @Bean
    public MyBean IfLazyInit(){
        System.out.println("initialized");
        return new MyBean();
    }
}

@Primary 注解

指示當(dāng)多個候選者有資格自動裝配依賴項(xiàng)時,應(yīng)優(yōu)先考慮bean。此注解在語義上就等同于在Spring XML中定義的bean 元素的primary屬性。

注意:除非使用component-scanning進(jìn)行組件掃描,否則在類級別上使用@Primary不會有作用。如果@Primary 注解定義在XML中,那么@Primary 的注解元注解就會忽略,相反的話就可以優(yōu)先使用。另外,關(guān)注Java知音公眾號,回復(fù)“后端面試”,送你一份面試題寶典!

@Primary 的兩種使用方式:

  • 與@Bean 一起使用,定義在方法上,方法級別的注解
  • 與@Component 一起使用,定義在類上,類級別的注解

新建一個AppConfigWithPrimary類,在方法級別上定義@Primary注解

@Configuration
public class AppConfigWithPrimary {
    @Bean
    public MyBean myBeanOne(){
        return new MyBean();
    }
    @Bean
    @Primary
    public MyBean myBeanTwo(){
        return new MyBean();
    }
}

上面代碼定義了兩個bean ,其中myBeanTwo 由@Primary 進(jìn)行標(biāo)注,表示它首先會進(jìn)行注冊,使用測試類進(jìn)行測試。

到此這篇關(guān)于深入解析Spring中的@Bean注解的文章就介紹到這了,更多相關(guān)Spring的@Bean注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring事務(wù)之事務(wù)掛起和事務(wù)恢復(fù)源碼解讀

    spring事務(wù)之事務(wù)掛起和事務(wù)恢復(fù)源碼解讀

    這篇文章主要介紹了spring事務(wù)之事務(wù)掛起和事務(wù)恢復(fù)源碼解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • java如何將list中的某個元素移動位置

    java如何將list中的某個元素移動位置

    在Java編程中我們經(jīng)常會使用List數(shù)據(jù)結(jié)構(gòu)來存儲一組元素,下面這篇文章主要給大家介紹了關(guān)于java如何將list中的某個元素移動位置的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • Java使用POI-TL和JFreeChart動態(tài)生成Word報(bào)告

    Java使用POI-TL和JFreeChart動態(tài)生成Word報(bào)告

    本文介紹了使用POI-TL和JFreeChart生成包含動態(tài)數(shù)據(jù)和圖表的Word報(bào)告的方法,并分享了實(shí)際開發(fā)中的踩坑經(jīng)驗(yàn),通過代碼示例講解的非常詳細(xì),具有一定的參考價值,需要的朋友可以參考下
    2025-02-02
  • 詳解使用MyBatis Generator自動創(chuàng)建代碼

    詳解使用MyBatis Generator自動創(chuàng)建代碼

    這篇文章主要介紹了使用MyBatis Generator自動創(chuàng)建代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • Java正確比較浮點(diǎn)數(shù)的方法

    Java正確比較浮點(diǎn)數(shù)的方法

    這篇文章主要介紹了Java正確比較浮點(diǎn)數(shù)的方法,幫助大家更好的利用Java比較浮點(diǎn)數(shù)數(shù)據(jù),感興趣的朋友可以了解下
    2020-11-11
  • Windows下RabbitMQ安裝及配置詳解

    Windows下RabbitMQ安裝及配置詳解

    本文主要介紹了Windows下RabbitMQ安裝及配置詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • springboot(thymeleaf)中th:field和th:value的區(qū)別及說明

    springboot(thymeleaf)中th:field和th:value的區(qū)別及說明

    這篇文章主要介紹了springboot(thymeleaf)中th:field和th:value的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Spring Boot和Kotlin的無縫整合與完美交融

    Spring Boot和Kotlin的無縫整合與完美交融

    這篇文章主要給大家介紹了關(guān)于Spring Boot和Kotlin的無縫整合與完美交融的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-06-06
  • Java實(shí)現(xiàn)批量下載文件的示例代碼

    Java實(shí)現(xiàn)批量下載文件的示例代碼

    這篇文章主要為大家詳細(xì)介紹了Java如何實(shí)現(xiàn)批量下載文件,并以壓縮輸出流的形式返回前端,文中的示例代碼講解詳細(xì),需要的小伙伴可以參考一下
    2023-10-10
  • Java設(shè)計(jì)模式之備忘錄模式使用詳解

    Java設(shè)計(jì)模式之備忘錄模式使用詳解

    這篇文章主要介紹了Java設(shè)計(jì)模式中備忘錄模式的使用,備忘錄設(shè)計(jì)模式也叫作快照模式,主要用于實(shí)現(xiàn)防丟失、撤銷、恢復(fù)等功能,本文將通過示例為大家講解備忘錄模式的定義與使用,需要的同學(xué)可以參考一下
    2024-02-02

最新評論

云阳县| 祁阳县| 临泽县| 高州市| 诸城市| 峨眉山市| 克什克腾旗| 广河县| 兴安县| 宁夏| 家居| 鹤壁市| 金乡县| 敖汉旗| 农安县| 建水县| 周口市| 鄂尔多斯市| 揭西县| 上栗县| 永胜县| 长汀县| 萨嘎县| 吉木萨尔县| 巴林左旗| 墨玉县| 当阳市| 大石桥市| 遂川县| 沂南县| 洪湖市| 福泉市| 磐安县| 皮山县| 奇台县| 潍坊市| 会同县| 启东市| 渝中区| 治多县| 嘉祥县|