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

SpringBoot?@Configuration與@Bean注解使用介紹

 更新時(shí)間:2022年10月13日 15:44:43   作者:一根頭發(fā)學(xué)一年  
這篇文章主要介紹了SpringBoot中的@Configuration與@Bean注解,在進(jìn)行項(xiàng)目編寫前,我們還需要知道一個(gè)東西,就是SpringBoot對(duì)我們的SpringMVC還做了哪些配置,包括如何擴(kuò)展,如何定制,只有把這些都搞清楚了,我們?cè)谥笫褂貌艜?huì)更加得心應(yīng)手

之前我們都是通過xml的方式定義bean,里面會(huì)寫很多bean元素,然后spring啟動(dòng)的時(shí)候,就會(huì)讀取bean xml配置文件,然后解析這些配置,然后會(huì)將這些bean注冊(cè)到spring容器中,供使用者使用。

Spring3.0開始,@Configuration用于定義配置類,定義的配置類可以替換xml文件,一般和@Bean注解聯(lián)合使用。

@Configuration注解可以加在類上,讓這個(gè)類的功能等同于一個(gè)bean xml配置文件。

@Bean注解類似于bean xml配置文件中的bean元素,用來在spring容器中注冊(cè)一個(gè)bean。

demo示例

1.創(chuàng)建一個(gè)工程

2.創(chuàng)建bean文件夾并創(chuàng)建兩個(gè)示例用戶和部門

如下:

用戶

package com.example.ethan.bean;
public class User {
    private String name;
    private Integer age;
    private Dept dept;
	public User() {
	}
    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    public Dept getDept() {
        return dept;
    }
    public void setDept(Dept dept) {
        this.dept = dept;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
}

部門

package com.example.ethan.bean;
public class Dept {
    private String name;
    public Dept(String name) {
        this.name = name;
    }
}

3.創(chuàng)建配置類

使用@Configuration注解,并使用@Bean注解創(chuàng)建bean

package com.example.ethan.config;
import com.example.ethan.bean.Dept;
import com.example.ethan.bean.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration  //告訴SpringBoot這是一個(gè)配置類 == 配置文件
public class ConfigDemo {
    @Bean //給容器中添加組件。以方法名作為組件的id。返回類型就是組件類型。返回的值,就是組件在容器中的實(shí)例
    public User user01(){
        User zhangsan = new User("zhangsan", 18);
        return zhangsan;
    }
    @Bean("my rd")
    public Dept rd(){
        return new Dept("研發(fā)部");
    }
}

4.在主程序查看

編寫主程序,查看容器中的Bean

package com.example.ethan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class EthanApplication {
    public static void main(String[] args) {
        // 返回ioc容器
        ConfigurableApplicationContext run = SpringApplication.run(EthanApplication.class, args);
        // 查看容器組件
        String[] beanDefinitionNames = run.getBeanDefinitionNames();
        System.out.println("========================");
        for (String name : beanDefinitionNames) {
            System.out.println(name);
        }
    }
}

運(yùn)行后可以看到configDemo、user01、my rd都已經(jīng)被容器管理。

特點(diǎn)和特性

1.配置類本身也是組件,也會(huì)有被IOC容器管理的Bean,且是一個(gè)單實(shí)例的代理對(duì)象。

在主程序驗(yàn)證代碼如下:

ConfigDemo bean = run.getBean(ConfigDemo.class);
 System.out.println(bean);

// 結(jié)果:com.example.ethan.config.ConfigDemo$$EnhancerBySpringCGLIB$$24eef7b3@a619c2

可以看到得到的bean是一個(gè)CGLIB代理對(duì)象。

2.默認(rèn)被IOC容器管理@Bean注解產(chǎn)生的Bean是單實(shí)例的。

在主程序驗(yàn)證代碼如下:

Dept d1 = run.getBean("my rd", Dept.class);
Dept d2 = run.getBean("my rd", Dept.class);
System.out.println("組件:"+(d1 == d2));
// 組件:true

結(jié)果為true,證明@Bean注解產(chǎn)生的Bean是單實(shí)例的。

3.@configration的proxyBeanMethods屬性。

這個(gè)屬性默認(rèn)為true。他的意思就是,當(dāng)從容器獲取Bean時(shí),是否用上面第1點(diǎn)中的代理對(duì)象調(diào)用方法獲取bean。

增加驗(yàn)證如下:

	ConfigDemo bean = run.getBean(ConfigDemo.class);
    System.out.println(bean);
	// 如果@Configuration(proxyBeanMethods = true)代理對(duì)象調(diào)用方法
    User user = bean.user01();
    User user1 = bean.user01();
    System.out.println(user == user1);

當(dāng)configration的proxyBeanMethods=true時(shí),結(jié)果為true,否則結(jié)果為false。
也就是,當(dāng)proxyBeanMethods=true,使用代理對(duì)象獲取Bean,代理會(huì)攔截所有被@Bean修飾的方法,默認(rèn)情況(bean為單例)下確保這些方法只被調(diào)用一次,放進(jìn)容器,然后從容器查找到,就會(huì)直接使用,從而確保這些bean是同一個(gè)bean,即單例的。

否則,不使用代理對(duì)象獲取Bean,每次獲取都新建,所以兩個(gè)Bean不相等。

這樣做的主要目的是為了解決組件依賴問題,比如下面的部門被用戶
依賴,可以保證用戶依賴的部門是單實(shí)例。

驗(yàn)證代碼如下:

首先讓用戶依賴部門

package com.example.ethan.config;
import com.example.ethan.bean.Dept;
import com.example.ethan.bean.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods=true)  //告訴SpringBoot這是一個(gè)配置類 == 配置文件
public class ConfigDemo {
    @Bean //給容器中添加組件。以方法名作為組件的id。返回類型就是組件類型。返回的值,就是組件在容器中的實(shí)例
    public User user01(){
        User zhangsan = new User("zhangsan", 18);
        //user組件依賴了Dept組件
        zhangsan.setDept(rd());
        return zhangsan;
    }
    @Bean("my rd")
    public Dept rd(){
        return new Dept("研發(fā)部");
    }
}

然后測(cè)試用戶依賴的組件是否是容器中的Bean

	User user01 = run.getBean("user01", User.class);
    Dept dept = run.getBean("tom", Dept.class);
    System.out.println("用戶的寵物:"+(user01.getDept() == dept));
    // // 用戶的部門:true

測(cè)試可以看到,當(dāng)proxyBeanMethods=true時(shí),結(jié)果為true,否則為false。

當(dāng)proxyBeanMethods=true時(shí)也稱為 Full模式,否則稱為L(zhǎng)ite模式。

Full(proxyBeanMethods = true)【保證每個(gè)@Bean方法被調(diào)用多少次返回的組件都是單實(shí)例的】
Lite(proxyBeanMethods = false)【每個(gè)@Bean方法被調(diào)用多少次返回的組件都是新創(chuàng)建的】
組件依賴必須使用Full模式默認(rèn)。其他默認(rèn)是否Lite模式。
最佳實(shí)戰(zhàn)

  • 配置 類組件之間無依賴關(guān)系用Lite模式加速容器啟動(dòng)過程,減少判斷
  • 配置類組件之間有依賴關(guān)系,方法會(huì)被調(diào)用得到之前單實(shí)例組件,用Full模式

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

相關(guān)文章

  • Spring項(xiàng)目中使用Junit單元測(cè)試并配置數(shù)據(jù)源的操作

    Spring項(xiàng)目中使用Junit單元測(cè)試并配置數(shù)據(jù)源的操作

    這篇文章主要介紹了Spring項(xiàng)目中使用Junit單元測(cè)試并配置數(shù)據(jù)源的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java利用Jackson輕松處理JSON序列化與反序列化

    Java利用Jackson輕松處理JSON序列化與反序列化

    Jackson?是?Java?中最流行的?JSON?處理庫(kù)之一,它提供了許多注解來簡(jiǎn)化?JSON?的序列化和反序列化過程。這篇文章將介紹一些?Jackson?常用的注解,以幫助您更輕松地處理?JSON?數(shù)據(jù)
    2023-05-05
  • Spring6當(dāng)中獲取Bean的四種方式小結(jié)

    Spring6當(dāng)中獲取Bean的四種方式小結(jié)

    Spring 為Bean 的獲取提供了多種方式,通常包括4種方式,(也就是說在Spring中為Bean對(duì)象的創(chuàng)建準(zhǔn)備了多種方案,目的是:更加靈活),本文將通過代碼示例詳細(xì)的給大家介紹了一下這四種方式,需要的朋友可以參考下
    2024-04-04
  • 教你如何使用Java輸出各種形狀

    教你如何使用Java輸出各種形狀

    本文小編將向大家介紹的是如何利用Java輸出各種不同的形狀,本文一共介紹了七種有趣的形狀,感興趣的小伙伴趕快收藏起來吧
    2021-09-09
  • Spring技巧之如何動(dòng)態(tài)讀取配置文件

    Spring技巧之如何動(dòng)態(tài)讀取配置文件

    這篇文章主要介紹了Spring技巧之如何動(dòng)態(tài)讀取配置文件的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java 遍歷list和map的方法

    Java 遍歷list和map的方法

    這篇文章主要介紹了Java 遍歷list和map的方法,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-12-12
  • Java實(shí)現(xiàn)幾種序列化方式總結(jié)

    Java實(shí)現(xiàn)幾種序列化方式總結(jié)

    本篇文章主要介紹了Java實(shí)現(xiàn)幾種序列化方式總結(jié),包括Java原生以流的方法進(jìn)行的序列化、Json序列化、FastJson序列化、Protobuff序列化,有興趣的可以了解一下,
    2017-03-03
  • java字符串中常用的十個(gè)方法總結(jié)

    java字符串中常用的十個(gè)方法總結(jié)

    String類中提供了豐富的用于操作字符串的方法,下面這篇文章主要給大家介紹了關(guān)于java字符串中常用的十個(gè)方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • Spring Boot接收單個(gè)String入?yún)⒌慕鉀Q方法

    Spring Boot接收單個(gè)String入?yún)⒌慕鉀Q方法

    這篇文章主要給大家介紹了關(guān)于Spring Boot接收單個(gè)String入?yún)⒌慕鉀Q方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • IDEA里找不到Maven的有效解決辦法(小白超詳細(xì))

    IDEA里找不到Maven的有效解決辦法(小白超詳細(xì))

    這篇文章主要給大家介紹了關(guān)于IDEA里找不到Maven的有效解決辦法,文中通過圖文將解決的辦法介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07

最新評(píng)論

阜宁县| 长武县| 灵璧县| 娱乐| 重庆市| 溧水县| 南康市| 罗田县| 成武县| 赫章县| 赫章县| 奇台县| 奇台县| 莒南县| 托克托县| 梁河县| 海原县| 化隆| 孝感市| 旅游| 左云县| 永德县| 新民市| 米林县| 宣城市| 廊坊市| 青州市| 剑阁县| 商都县| 阜阳市| 开平市| 内江市| 甘南县| 郁南县| 龙里县| 游戏| 应城市| 邵阳县| 鄂托克旗| 伊金霍洛旗| 丰镇市|