SpringBoot配置@Configuration注解和@bean注解
1.@Configuration注解
用法:作用在類上面 作用:告訴SpringBoot這是一個(gè)配置類,相當(dāng)于Spring中的xml配置文件。
@Configuration //告訴SpringBoot這是一個(gè)配置類 == 配置文件 public class Config { }
2.@bean注解
用法:配置類里面使用@Bean標(biāo)注在方法上給IoC容器注冊(cè)組件,默認(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容器中的對(duì)象,看看我們的person1
和customize
有沒有添加到容器中
@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è)對(duì)象
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()
方法會(huì)發(fā)生什么情況,它是從IoC容器中拿還是直接new一個(gè)對(duì)象呢
- 在new一個(gè)配置類出來(lái)的情況下,調(diào)用person1方法,它返回的是new出來(lái)的對(duì)象
- 但是如果我們從容器中取得的配置類,無(wú)論再去掉用多少次person1方法,它始終返回的都是同一個(gè)單實(shí)例對(duì)象,也就是從IoC容器中拿的對(duì)象。
@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); //獲取到的本身就是代理對(duì)象 //com.ysw.boot.config.Config$$EnhancerBySpringCGLIB$$4aa44992@381d7219 System.out.println(bean); //如果我們直接調(diào)用person1方法,它是從IoC容器中拿還是直接new一個(gè)對(duì)象呢, //在new一個(gè)配置類出來(lái)的情況下,調(diào)用person1方法,它返回的是new出來(lái)的對(duì)象 Config config = new Config(); Person person3 = config.person1(); Person person4 = config.person1(); System.out.println("person3 == person4 :"+ (person3 == person4)); //但是如果我們從容器中取得的配置類,無(wú)論再去掉用多少次person1方法,它始終返回的都是同一個(gè)單實(shí)例對(duì)象,也就是從IoC容器中拿的對(duì)象。 //如果@Configuration(proxyBeanMethods = true)代理對(duì)象調(diào)用方法。SpringBoot總會(huì)檢查這個(gè)組件是否在容器中有; //保持組件單實(shí)例 Person person5 = bean.person1(); Person person6 = bean.person1(); System.out.println("person5 == person6 :"+ (person5 == person6)); } }
輸出結(jié)果:
6.proxyBeanMethods——代理bean的方法
從容器中獲取到的配置類對(duì)象輸出結(jié)果:
com.ysw.boot.config.Config$$EnhancerBySpringCGLIB$$4aa44992@381d7219
在上述的輸出結(jié)果中我們可以看到從容器中獲取到的配置類對(duì)象本身就是一個(gè)被SpringCGLIB增強(qiáng)了的代理對(duì)象
@Configuration()
默認(rèn)設(shè)置的是proxyBeanMethods = true
。- 如果
@Configuration(proxyBeanMethods = true)
,就是代理對(duì)象調(diào)用方法。SpringBoot總會(huì)檢查這個(gè)組件是否在容器中已有,調(diào)用配置類中的方法時(shí)會(huì)返回容器中已有的組件(即IoC容器中已存在的對(duì)象)。 - 如果
@Configuration(proxyBeanMethods = false)
,就不是代理對(duì)象調(diào)用方法,SpringBoot不會(huì)檢查這個(gè)組件是否在容器中已有,調(diào)用配置類中的方法時(shí)會(huì)返回新對(duì)象。
@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模式
- 配置類組件之間無(wú)依賴關(guān)系用Lite模式加速容器啟動(dòng)過程,調(diào)用配置類中的方法時(shí),SpringBoot每次都不會(huì)判斷對(duì)象在容器中是否已經(jīng)存在,減少了判斷過程
- 配置類組件之間有依賴關(guān)系,調(diào)用配置類中的方法時(shí),SpringBoot每次都會(huì)判斷對(duì)象在容器中是否已經(jīng)存在,方法會(huì)被調(diào)用得到之前單實(shí)例組件,用Full模式
到此這篇關(guān)于SpringBoot配置@Configuration注解和@bean注解的文章就介紹到這了,更多相關(guān)SpringBoot配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot獲取Request對(duì)象的常見方法
HttpServletRequest 簡(jiǎn)稱 Request,它是一個(gè) Servlet API 提供的對(duì)象,用于獲取客戶端發(fā)起的 HTTP 請(qǐng)求信息,那么在SpringBoot中,獲取 Request對(duì)象的方法有哪些呢,本文小編將給大家講講SpringBoot獲取Request對(duì)象的常見方法2023-08-08Java回調(diào)函數(shù)與觀察者模式實(shí)例代碼
這篇文章主要介紹了Java回調(diào)函數(shù)與觀察者模式實(shí)例代碼,簡(jiǎn)單介紹了使用觀察者模式的場(chǎng)景,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02Java8使用lambda實(shí)現(xiàn)Java的尾遞歸
這篇文章主要介紹了Java8使用lambda實(shí)現(xiàn)Java的尾遞歸的相關(guān)資料,需要的朋友可以參考下2017-10-10Java?SpringTask定時(shí)自動(dòng)化處理方法
這篇文章主要介紹了Java?SpringTask定時(shí)自動(dòng)化處理,通過自動(dòng)化,不僅可以提高工作效率和準(zhǔn)確性,還可以釋放人力資源以專注于更高價(jià)值的工作,需要的朋友可以參考下2024-08-08Spring自定義注解實(shí)現(xiàn)數(shù)據(jù)脫敏
在當(dāng)今數(shù)據(jù)安全越來(lái)越受到重視的背景下,許多企業(yè)都對(duì)敏感數(shù)據(jù)的保護(hù)有著嚴(yán)格的要求,本文就來(lái)深入探討一下如何自定義注解來(lái)實(shí)現(xiàn)對(duì)敏感數(shù)據(jù)的脫敏處理吧2024-11-11