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

關(guān)于@Bean的使用方式

 更新時(shí)間:2022年08月23日 11:12:43   作者:飄零未歸人  
這篇文章主要介紹了關(guān)于@Bean的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

@Bean是一個(gè)方法級(jí)別上的注解,主要用在@Configuration注解的類里,也可以用在@Component注解的類里。

目的是創(chuàng)建一個(gè)類。當(dāng)spring需要?jiǎng)?chuàng)建指定的一個(gè)類時(shí)會(huì)調(diào)用這個(gè)注解(@Bean)的方法。

一個(gè)對(duì)象

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Info {
? ? String name;
? ? int age;
}

就如同在在xml配置中添加一個(gè)類的配置。這樣spring在自動(dòng)創(chuàng)建這個(gè)類時(shí)會(huì)調(diào)用配置的方法。

<bean id="info" class="zhong.test.springbootdemo.usultestdemo.demo.Info">
?? ?<property name="name" value="sjl"/>
? ? <property name="age" value="18"/>
</bean>

SprignBoot中 @Bean 完美的替換了了上面的這種在xml中配置的方法。使用以下方法就能讓spring在需要自動(dòng)創(chuàng)建Info對(duì)象時(shí),自動(dòng)調(diào)用這個(gè)方法。

@Configuration
public class BeanInit {
? ? /**
? ? ?* 測(cè)試@Bean的作用
? ? ?*/
? ? @Bean(name = "info")
? ? public Info getInfo(){
? ? ? ? return new Info("gfagduis", 2343);
? ? }
? ? @Bean(name = "info1")
? ? public Info getInfo1(){
? ? ? ? return new Info("gfagdufasfdfdais", 2343);
? ? }
}

獲取這個(gè)類的方法

1、AnnotationConfigApplicationContext 類獲取

@Component
public class BeanTest implements CommandLineRunner {
? ? private void getBean(){
? ? ? ? ApplicationContext ctx = new AnnotationConfigApplicationContext(BeanInit.class);
? ? ? ? Info info1= ctx.getBean("info",Info.class);
? ? ? ? System.out.println(info1);
? ? }
? ? @Override
? ? public void run(String... args) throws Exception {
? ? ? ? System.out.println(">>>>>>>>>>>>>>>服務(wù)啟動(dòng)執(zhí)行,執(zhí)行加載數(shù)據(jù)等操作<<<<<<<<<<<<<");
? ? ? ? getBean();
? ? }
}

2、在spring自動(dòng)創(chuàng)建的類中

在構(gòu)造方法中設(shè)置這個(gè)值,這樣spring就會(huì)調(diào)用該類的創(chuàng)建方法來獲取這個(gè)初始化的類。

@Component
public class BeanTest implements CommandLineRunner {
? ? private Info info;
?? ?/**
?? ? *spring創(chuàng)建BeanTest對(duì)象時(shí)會(huì)調(diào)用這個(gè)構(gòu)造函數(shù)。參數(shù)是info1,所以會(huì)調(diào)用 @Bean(name = "info1") 注釋的方法
?? ? *
?? ? */
? ? public BeanTest (Info info1){
? ? ? ? this.info = info1;
? ? }
? ??
? ?private void getBean2(){
? ? ? ? System.out.println(info);
? ? }
? ? @Override
? ? public void run(String... args) throws Exception {
? ? ? ? System.out.println(">>>>>>>>>>>>>>>服務(wù)啟動(dòng)執(zhí)行,執(zhí)行加載數(shù)據(jù)等操作<<<<<<<<<<<<<");
? ? ? ? getBean2();
? ? }
}

在構(gòu)造函數(shù)中 BeanTest (Info info1) 參數(shù)的名稱是info1.所以就調(diào)用 @Bean(name = “info1”) 的方法來獲取初始化對(duì)象。

結(jié)果如下:

                          >>>>>>>>>>>>>>>服務(wù)啟動(dòng)執(zhí)行,執(zhí)行加載數(shù)據(jù)等操作<<<<<<<<<<<<<
                         Info(name=gfagdufasfdfdais, age=2343)

同時(shí)也是支持多別名配置的 例如:

? ? @Bean(name = { "info12", "info3", "info3" })
? ? public Info getInfo2(){
? ? ? ? return new Info("gfa4361783ais", 2343);
? ? }

測(cè)試一下

@Component
public class BeanTest implements CommandLineRunner {
? ? private Info info;
? ? private Info info1;
? ? private Info info2;
?? ?/**
?? ? *spring創(chuàng)建BeanTest對(duì)象時(shí)會(huì)調(diào)用這個(gè)構(gòu)造函數(shù)。參數(shù)是info1,所以會(huì)調(diào)用 @Bean(name = "info1") 注釋的方法
?? ? *
?? ? */
? ? public BeanTest (Info info1, Info info2, Info info3){
? ? ? ? this.info = info1;
? ? ? ? this.info1 = info2;
? ? ? ? this.info2 = info3;
? ? }
? ??
? ?private void getBean2(){
? ? ? ? System.out.println(info);
? ? ? ? System.out.println(info1);
? ? ? ? System.out.println(info2);
? ? }
? ? @Override
? ? public void run(String... args) throws Exception {
? ? ? ? System.out.println(">>>>>>>>>>>>>>>服務(wù)啟動(dòng)執(zhí)行,執(zhí)行加載數(shù)據(jù)等操作<<<<<<<<<<<<<");
? ? ? ? getBean2();
? ? }
}

結(jié)果如下

>>>>>>>>>>>>>>>服務(wù)啟動(dòng)執(zhí)行,執(zhí)行加載數(shù)據(jù)等操作<<<<<<<<<<<<<
Info(name=gfagdufasfdfdais, age=2343)
Info(name=gfa4361783ais, age=2343)
Info(name=gfa4361783ais, age=2343)

當(dāng)然也可以使用 Qualifier(“xxx”) 來指定 @Bean(name = “xxx”) 中的xxx就可以調(diào)用對(duì)應(yīng)的方法。

3、使用 @Autowired 注解獲取變量

如果有多個(gè)初始化方法,則會(huì)根據(jù)變量名稱來獲取。

在初始化類中建立以下多個(gè)初始方法

?@Configuration
public class BeanInit {
? ? /**
? ? ?* 測(cè)試@Bean的作用
? ? ?*/
? ? @Bean/*(initMethod = "init")*/
? ? public Info getInfo(){
? ? ? ? System.out.println("進(jìn)入方法");
? ? ? ? Info info = new Info("gfagduis", 2343);
? ? ? ? System.out.println("結(jié)束方法");
? ? ? ? return info;
? ? }
? ? @Bean(name = "info1")
? ? public Info getInfo1(){
? ? ? ? return new Info("gfagdufasfdfdais", 2343);
? ? }
? ? @Bean(name = { "info2", "info3", "info3" })
? ? public Info getInfo2(){
? ? ? ? return new Info("gfa4361783ais", 2343);
? ? }
? ? @Bean
? ? public Info info(){
? ? ? ? return new Info("gfsdfadsfad4361783ais", 23143);
? ? }

然后在測(cè)試方法中分別用 @Autowired注釋Info類來獲取對(duì)應(yīng)的對(duì)象

@Component
public class BeanTest implements CommandLineRunner {
? ? //private Info info;
? ? @Autowired
? ? private Info getInfo;
? ? @Autowired
? ? private Info info1;
? ? @Autowired
? ? private Info info3;
? ? @Autowired
? ? private Info info;
? ? /*public BeanTest (Info info){
? ? ? ? this.info = info;
? ? }*/
? ? private void getBean(){
? ? ? ? /*ApplicationContext ctx = new AnnotationConfigApplicationContext(BeanInit.class);
? ? ? ? Info person = ctx.getBean("info",Info.class);
? ? ? ? System.out.println(person);*/
? ? ? ? System.out.println(getInfo);
? ? ? ? System.out.println(info1);
? ? ? ? System.out.println(info3);
? ? ? ? System.out.println(info);
? ? }
? ? @Override
? ? public void run(String... args) throws Exception {
? ? ? ? System.out.println(">>>>>>>>>>>>>>>服務(wù)啟動(dòng)執(zhí)行,執(zhí)行加載數(shù)據(jù)等操作<<<<<<<<<<<<<");
? ? ? ? getBean();
? ? }
}

測(cè)試結(jié)果如下:

>>>>>>>>>>>>>>>服務(wù)啟動(dòng)執(zhí)行,執(zhí)行加載數(shù)據(jù)等操作<<<<<<<<<<<<<
Info(name=gfagduis, age=2343)
Info(name=gfagdufasfdfdais, age=2343)
Info(name=gfa4361783ais, age=2343)
Info(name=gfsdfadsfad4361783ais, age=23143)

在使用 @Autowired 注解時(shí),也可以與 @Qualifier(“xxx”) 指定使用哪個(gè)方法來獲取對(duì)象。

@Bean 注解的屬性解析

value 和 name

name 和 value 兩個(gè)屬性是相同的含義的, 在代碼中定義了別名。 為 bean 起一個(gè)名字,如果默認(rèn)沒有寫該屬性,那么就使用方法的名稱為該 bean 的名稱

autowire

裝配方式 有三個(gè)選項(xiàng)

  • Autowire.NO (默認(rèn)設(shè)置)
  • Autowire.BY_NAME
  • Autowire.BY_TYPE

指定 bean 的裝配方式, 根據(jù)名稱 和 根據(jù)類型 裝配, 一般不設(shè)置,采用默認(rèn)即可。

initMethod

bean 的初始化方法, 直接指定方法名稱即可,不用帶括號(hào)。初始方法要在對(duì)應(yīng)的POHO中,也就是Info類中。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Info {
? ? String name;
? ? int age;
? ? private void init(){
? ? ? ? System.out.println("進(jìn)入方法2");
? ? ? ? name = "fhasjdf";
? ? ? ? age = 12;
? ? }
}
@Configuration
public class BeanInit {
? ? /**
? ? ?* 測(cè)試@Bean的作用
? ? ?*/
? ? @Bean(name = "info", initMethod = "init")
? ? public Info getInfo(){
? ? ? ? System.out.println("進(jìn)入方法");
? ? ? ? Info info = new Info("gfagduis", 2343);
? ? ? ? System.out.println("結(jié)束方法");
? ? ? ? return info;
? ? }

最終結(jié)果、:

進(jìn)入方法
結(jié)束方法
進(jìn)入方法2
2019-09-24 14:57:11.917  INFO 11656 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-09-24 14:57:12.048  INFO 11656 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2019-09-24 14:57:12.051  INFO 11656 --- [           main] z.t.s.u.start.UsulTestStartApplication   : Started UsulTestStartApplication in 1.74 seconds (JVM running for 2.246)
>>>>>>>>>>>>>>>服務(wù)啟動(dòng)執(zhí)行,執(zhí)行加載數(shù)據(jù)等操作<<<<<<<<<<<<<
Info(name=fhasjdf, age=12)

所以最終調(diào)用的是init()方法來創(chuàng)建類。

destroyMethod

bean 的銷毀方法, 在調(diào)用 IoC 容器的 close() 方法時(shí),會(huì)執(zhí)行到該屬性指定的方法。不過,只是單實(shí)例的 bean 才會(huì)調(diào)用該方法,如果是多實(shí)例的情況下,不會(huì)調(diào)用該方法。

注意:

由于spring構(gòu)造的對(duì)象都是單例的,所以只要是從spring ioc中獲取的對(duì)象都是同一個(gè),他們中的屬性,即便是私有的非靜態(tài)屬性。都是公用的。

public class MyDisposableBean implements DisposableBean {
? ? public Map<String, String> map = new HashMap<>();
? ? int i = 0;
? ? private void init(){
? ? ? ? System.out.println("MyDisposableBean自定義初始化方法");
? ? }
? ? private void destroyMethod(){
? ? ? ? System.out.println("自定義銷毀方法,MyDisposableBean對(duì)象銷毀");
? ? }
? ? public void pringt(){
? ? ? ? System.out.println("-------------------------------");
? ? ? ? System.out.println("i=" + i);
? ? ? ? System.out.println("map.size=" + map.size());
? ? ? ? map.entrySet().stream().forEach(item -> System.out.println("map -> ? "+ item.getKey() + "---" + item.getValue()));
? ? }
}
@Configuration
public class BeanConfigurer {
    @Bean(name = "MyDisposableBean", initMethod = "init", destroyMethod = "destroyMethod")
    public MyDisposableBean getMyDisposableBean(){
        System.out.println("MyDisposableBean構(gòu)造方法");
        return new MyDisposableBean();
    }
}
@Component
public class DisposableBeanTest implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {
        MyDisposableBean myDisposableBean = new MyDisposableBean();
        MyDisposableBean myDisposableBean1 = new MyDisposableBean();
        MyDisposableBean myDisposableBean2 = SpringContextUtils.getBean(MyDisposableBean.class);
        myDisposableBean2.pringt();
        myDisposableBean2.map.put("1", "2");
        myDisposableBean2.i = 2;
        MyDisposableBean myDisposableBean3 = SpringContextUtils.getBean(MyDisposableBean.class);
        myDisposableBean3.pringt();
        myDisposableBean1.pringt();
    }
}

測(cè)試結(jié)果:

MyDisposableBean構(gòu)造方法
MyDisposableBean自定義初始化方法
-------------------------------
i=0
map.size=0
-------------------------------
i=0
map.size=0
-------------------------------
i=2
map.size=1
map ->   1---2
-------------------------------
i=0
map.size=0

可以看出,如果是我們自己在程序中new的對(duì)象(myDisposableBean 和 myDisposableBean1),其私有屬性map和i是不變的。不相互影響。

另外兩從spring ioc中獲取的對(duì)象(myDisposableBean2 和 myDisposableBean3 )的map和i兩個(gè)屬性,是公用的。其中一個(gè)對(duì)象修改值,name另外一個(gè)對(duì)象的屬性也相應(yīng)的變化

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot中基于AOP和Semaphore實(shí)現(xiàn)API限流

    SpringBoot中基于AOP和Semaphore實(shí)現(xiàn)API限流

    調(diào)用速率限制是 Web API 中的常見要求,旨在防止濫用并確保公平使用資源,借助Spring Boot 中的 AOP,我們可以通過攔截方法調(diào)用并限制在特定時(shí)間范圍內(nèi)允許的請(qǐng)求數(shù)量來實(shí)現(xiàn)速率限制,需要的朋友可以參考下
    2024-10-10
  • Java如何處理圖片保存之后變紅色的問題

    Java如何處理圖片保存之后變紅色的問題

    這篇文章主要介紹了Java如何處理圖片保存之后變紅色的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • java金錢處理方法實(shí)例詳解

    java金錢處理方法實(shí)例詳解

    這篇文章主要介紹了java金錢處理方法實(shí)例詳解的相關(guān)資料,這里提供實(shí)現(xiàn)方法分轉(zhuǎn)化成元的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2017-08-08
  • spring中JdbcTemplate操作oracle的存儲(chǔ)過程實(shí)例代碼

    spring中JdbcTemplate操作oracle的存儲(chǔ)過程實(shí)例代碼

    JdbcTemplate是Spring對(duì)JDBC的封裝,目的是使JDBC更加易于使用,JdbcTemplate是Spring的一部分,下面這篇文章主要給大家介紹了關(guān)于spring中JdbcTemplate操作oracle的存儲(chǔ)過程的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • SpringBoot+Redisson自定義注解一次解決重復(fù)提交問題

    SpringBoot+Redisson自定義注解一次解決重復(fù)提交問題

    項(xiàng)目中經(jīng)常會(huì)出現(xiàn)重復(fù)提交的問題,本文主要介紹了SpringBoot+Redisson自定義注解一次解決重復(fù)提交問題,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • 基于Java實(shí)現(xiàn)五子棋小游戲(附源碼)

    基于Java實(shí)現(xiàn)五子棋小游戲(附源碼)

    這篇文章主要為大家介紹了如何通過Java實(shí)現(xiàn)簡(jiǎn)單的五子棋游戲,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java游戲開發(fā)有一定幫助,需要的可以參考一下
    2022-11-11
  • SpringBoot2零基礎(chǔ)到精通之異常處理與web原生組件注入

    SpringBoot2零基礎(chǔ)到精通之異常處理與web原生組件注入

    SpringBoot是Spring全家桶的成員之一,基于約定優(yōu)于配置的思想(即有約定默認(rèn)值,在不配置的情況下會(huì)使用默認(rèn)值,在配置文件下配置的話會(huì)使用配置的值)。SpringBoot是一種整合Spring技術(shù)棧的方式(或者說是框架),同時(shí)也是簡(jiǎn)化Spring的一種快速開發(fā)的腳手架
    2022-03-03
  • Spring6整合JUnit的詳細(xì)步驟

    Spring6整合JUnit的詳細(xì)步驟

    這篇文章主要介紹了Spring6整合JUnit的詳細(xì)步驟,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • java 全角半角字符轉(zhuǎn)換的方法實(shí)例

    java 全角半角字符轉(zhuǎn)換的方法實(shí)例

    這篇文章主要介紹了java 全角半角字符轉(zhuǎn)換的方法,大家參考使用吧
    2013-11-11
  • 冒泡排序的原理及java代碼實(shí)現(xiàn)

    冒泡排序的原理及java代碼實(shí)現(xiàn)

    冒泡排序法:關(guān)鍵字較小的記錄好比氣泡逐趟上浮,關(guān)鍵字較大的記錄好比石塊下沉,每趟有一塊最大的石塊沉底。算法本質(zhì):(最大值是關(guān)鍵點(diǎn),肯定放到最后了,如此循環(huán))每次都從第一位向后滾動(dòng)比較,使最大值沉底,最小值上升一次,最后一位向前推進(jìn)
    2016-02-02

最新評(píng)論

民权县| 华安县| 紫金县| 天台县| 上蔡县| 新疆| 沈阳市| 云林县| 会昌县| 台州市| 长顺县| 黄骅市| 平和县| 兴城市| 惠东县| 安图县| 宁安市| 喀什市| 越西县| 苍南县| 芜湖县| 南木林县| 右玉县| 柳林县| 东乡| 临泉县| 依安县| 海伦市| 沧源| 安泽县| 双柏县| 德阳市| 建宁县| 华容县| 工布江达县| 杭锦后旗| 宜章县| 上饶市| 宁国市| 新晃| 通江县|