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

SpringBoot配置@Configuration注解和@bean注解

 更新時(shí)間:2022年04月25日 16:26:43   作者:??YuShiwen????  
這篇文章主要介紹了SpringBoot配置@Configuration注解和@bean注解,文章圍繞主題相關(guān)內(nèi)容展開詳細(xì)介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下

1.@Configuration注解

用法:作用在類上面 作用:告訴SpringBoot這是一個(gè)配置類,相當(dāng)于Spring中的xml配置文件。

@Configuration //告訴SpringBoot這是一個(gè)配置類 == 配置文件
public class Config {
}

2.@bean注解

用法:配置類里面使用@Bean標(biāo)注在方法上給IoC容器注冊組件,默認(rèn)也是單實(shí)例的 作用:給容器中添加組件,相當(dāng)于Spring中xml配置文件中的<bean>標(biāo)簽。 理解:以方法名作為組件的id。返回類型就是組件類型。返回的值,就是組件在容器中的實(shí)例

@Configuration //告訴SpringBoot這是一個(gè)配置類 == 配置文件
public class Config {
    @Bean   //給容器中添加組件。以方法名作為組件的id。返回類型就是組件類型。返回的值,就是組件在容器中的實(shí)例
    public Person person1(){
        return new Person("Mr.Yu",21,"male");
    }
    @Bean("customize")  //id值也可以指定
    public Person person2(){
        return new Person("小明",20,"male");
    }
}

在主程序類中打印輸出我們IoC容器中的對象,看看我們的person1customize有沒有添加到容器中

@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {
        //1.返回我們IOC容器
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
        //2.查看容器里面的組件
        String[] names = run.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
    }
}

輸出結(jié)果: 

 可以看到輸出結(jié)果中有我們存放進(jìn)IoC容器的兩個(gè)對象

3.單實(shí)例

@Bean注解存入到IoC容器中的實(shí)例也是單實(shí)例的

public static void main(String[] args) {
        //1.返回我們IOC容器
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
        //2.查看容器里面的組件
        String[] names = run.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
        //單實(shí)例
        Person person1 = run.getBean("person1",Person.class);
        Person person2 = run.getBean("person1",Person.class);
        System.out.println("person1 == person2 :"+ (person1 == person2));
}

輸出結(jié)果: 

4.配置類也是容器的組件

@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {
        //1.返回我們IOC容器
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
        //2.查看容器里面的組件
        String[] names = run.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
        //配置類本身也是組件
        Config bean = run.getBean(Config.class);
        //com.ysw.boot.config.Config$$EnhancerBySpringCGLIB$$4aa44992@381d7219
        System.out.println(bean);

    }
}

輸出結(jié)果:

com.ysw.boot.config.Config$$EnhancerBySpringCGLIB$$4aa44992@381d7219

5.直接調(diào)用配置類里面的person1()方法

如果我們直接調(diào)用配置類里面的person1()方法會發(fā)生什么情況,它是從IoC容器中拿還是直接new一個(gè)對象呢

  • 在new一個(gè)配置類出來的情況下,調(diào)用person1方法,它返回的是new出來的對象
  • 但是如果我們從容器中取得的配置類,無論再去掉用多少次person1方法,它始終返回的都是同一個(gè)單實(shí)例對象,也就是從IoC容器中拿的對象。
@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {
        //1.返回我們IOC容器
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
        //2.查看容器里面的組件
        String[] names = run.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
        //配置類本身也是組件
        Config bean = run.getBean(Config.class);
        //獲取到的本身就是代理對象
        //com.ysw.boot.config.Config$$EnhancerBySpringCGLIB$$4aa44992@381d7219
        System.out.println(bean);
        //如果我們直接調(diào)用person1方法,它是從IoC容器中拿還是直接new一個(gè)對象呢,
        //在new一個(gè)配置類出來的情況下,調(diào)用person1方法,它返回的是new出來的對象
        Config config = new Config();
        Person person3 = config.person1();
        Person person4 = config.person1();
        System.out.println("person3 == person4 :"+ (person3 == person4));
        //但是如果我們從容器中取得的配置類,無論再去掉用多少次person1方法,它始終返回的都是同一個(gè)單實(shí)例對象,也就是從IoC容器中拿的對象。
        //如果@Configuration(proxyBeanMethods = true)代理對象調(diào)用方法。SpringBoot總會檢查這個(gè)組件是否在容器中有;
        //保持組件單實(shí)例
        Person person5 = bean.person1();
        Person person6 = bean.person1();
        System.out.println("person5 == person6 :"+ (person5 == person6));
    }
}

輸出結(jié)果:

6.proxyBeanMethods——代理bean的方法

從容器中獲取到的配置類對象輸出結(jié)果:

com.ysw.boot.config.Config$$EnhancerBySpringCGLIB$$4aa44992@381d7219

在上述的輸出結(jié)果中我們可以看到從容器中獲取到的配置類對象本身就是一個(gè)被SpringCGLIB增強(qiáng)了的代理對象

  • @Configuration()默認(rèn)設(shè)置的是proxyBeanMethods = true
  • 如果@Configuration(proxyBeanMethods = true),就是代理對象調(diào)用方法。SpringBoot總會檢查這個(gè)組件是否在容器中已有,調(diào)用配置類中的方法時(shí)會返回容器中已有的組件(即IoC容器中已存在的對象)。
  • 如果@Configuration(proxyBeanMethods = false),就不是代理對象調(diào)用方法,SpringBoot不會檢查這個(gè)組件是否在容器中已有,調(diào)用配置類中的方法時(shí)會返回新對象。

@Configuration(proxyBeanMethods = false)

舉例: 把上述5中的@Configuration()改為@Configuration(proxyBeanMethods = false)

輸出結(jié)果為:

 總結(jié):

  • Full模式(proxyBeanMethods = true):保證每個(gè)@Bean方法被調(diào)用多少次返回的組件都是單實(shí)例的
  • Lite模式(proxyBeanMethods = false):每個(gè)@Bean方法被調(diào)用多少次返回的組件都是新創(chuàng)建的
  • 組件依賴必須使用Full模式默認(rèn)。其他默認(rèn)是否Lite模式
  • 配置類組件之間無依賴關(guān)系用Lite模式加速容器啟動過程,調(diào)用配置類中的方法時(shí),SpringBoot每次都不會判斷對象在容器中是否已經(jīng)存在,減少了判斷過程
  • 配置類組件之間有依賴關(guān)系,調(diào)用配置類中的方法時(shí),SpringBoot每次都會判斷對象在容器中是否已經(jīng)存在,方法會被調(diào)用得到之前單實(shí)例組件,用Full模式

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

相關(guān)文章

  • SpringBoot獲取Request對象的常見方法

    SpringBoot獲取Request對象的常見方法

    HttpServletRequest 簡稱 Request,它是一個(gè) Servlet API 提供的對象,用于獲取客戶端發(fā)起的 HTTP 請求信息,那么在SpringBoot中,獲取 Request對象的方法有哪些呢,本文小編將給大家講講SpringBoot獲取Request對象的常見方法
    2023-08-08
  • Java二叉樹的四種遍歷(遞歸和非遞歸)

    Java二叉樹的四種遍歷(遞歸和非遞歸)

    這篇文章主要介紹了Java二叉樹的四種遍歷,二叉樹的遍歷可以分為前序、中序、后序、層次遍歷,需要的朋友可以參考下
    2020-12-12
  • Java回調(diào)函數(shù)與觀察者模式實(shí)例代碼

    Java回調(diào)函數(shù)與觀察者模式實(shí)例代碼

    這篇文章主要介紹了Java回調(diào)函數(shù)與觀察者模式實(shí)例代碼,簡單介紹了使用觀察者模式的場景,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • 淺聊一下Java中的鎖機(jī)制

    淺聊一下Java中的鎖機(jī)制

    Java中的鎖機(jī)制是保證多線程并發(fā)訪問共享資源安全性的重要手段之一。Java提供了兩種類型的鎖機(jī)制:synchronized關(guān)鍵字和Lock接口。本文將介紹這兩種鎖機(jī)制的原理及使用方法,并通過代碼示例講解它們的使用
    2023-03-03
  • Java8使用lambda實(shí)現(xiàn)Java的尾遞歸

    Java8使用lambda實(shí)現(xiàn)Java的尾遞歸

    這篇文章主要介紹了Java8使用lambda實(shí)現(xiàn)Java的尾遞歸的相關(guān)資料,需要的朋友可以參考下
    2017-10-10
  • Java?SpringTask定時(shí)自動化處理方法

    Java?SpringTask定時(shí)自動化處理方法

    這篇文章主要介紹了Java?SpringTask定時(shí)自動化處理,通過自動化,不僅可以提高工作效率和準(zhǔn)確性,還可以釋放人力資源以專注于更高價(jià)值的工作,需要的朋友可以參考下
    2024-08-08
  • Spring自定義注解實(shí)現(xiàn)數(shù)據(jù)脫敏

    Spring自定義注解實(shí)現(xiàn)數(shù)據(jù)脫敏

    在當(dāng)今數(shù)據(jù)安全越來越受到重視的背景下,許多企業(yè)都對敏感數(shù)據(jù)的保護(hù)有著嚴(yán)格的要求,本文就來深入探討一下如何自定義注解來實(shí)現(xiàn)對敏感數(shù)據(jù)的脫敏處理吧
    2024-11-11
  • Mybatis中如何映射mysql中的JSON字段

    Mybatis中如何映射mysql中的JSON字段

    在mapper.xml中,需要在字段映射時(shí)加入typeHandler,具體:<id?property="abnormalEigenList"?column="AbnormalEigen"?typeHandler="com.xxx.config.JsonHandler">,下面通過本文給大家介紹Mybatis中,映射mysql中的JSON字段,需要的朋友可以參考下
    2023-10-10
  • SpringBoot 2 快速整合 Filter過程解析

    SpringBoot 2 快速整合 Filter過程解析

    這篇文章主要介紹了SpringBoot 2 快速整合 Filter過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Idea中指定xml文件失效的解決過程

    Idea中指定xml文件失效的解決過程

    最近在開發(fā)的過程中遇到了一個(gè)奇怪的問題,下面這篇文章主要給大家介紹了關(guān)于Idea中指定xml文件失效的解決過程,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01

最新評論