網站首頁 編程語言 正文
本文簡要總結下SpringBoot配置類使用的注解@Configuration的屬性proxyBeanMethods屬性的作用
(2) 給IOC容器中導入組件有如下幾種方式:
/**
* 給容器中添加組件的幾種方式:
* 1. 包掃描+組件標注注解的方式:@ComponentScan + 注解(@Controller,@Service,@Repository,@Component),局限性在于只有我們自己寫的類才能使用此種方式
* 2. @Bean注解導入第三方包里面的組件:在配置類中,使用@Bean注解給容器添加組件,好處是可以導入第三方的組件到容器中
* 3. @Import快速給容器中導入一個組件
* 3.1、@Import(要導入到容器中的組件),id默認是組件的全類名
* 3.2、@Import(使用ImportSelector導入需要的組件的全類名)
* 3.3、@Import(使用ImportBeanDefinitionRegister手動注冊bean到容器中)
* 4. 通過Spring提供的FactoryBean向容器中注入組件
* 4.1、 默認獲取到的似乎工程bean調用getObject創建的對象
* 4.2、 要獲取工廠Bean本身,需要給id前面加一個&,如&colorFactoryBean
* 5.使用@ImportResource注解導入xml配置文件(可以把古老項目中在xml中配置的bean組件導入到IOC
容器中來)
*/
(2)首先,明確的一點是,使用了@Configuration注解的配置類的目的是給IOC容器中添加組件,在配置類中使用@Bean注解標注在方法上:
Configuration(proxyBeanMethods = true) //告訴SpringBoot這是一個配置類 == 配置文件
public class MyConfig {
/**
* Full:外部無論對配置類中的這個組件注冊方法調用多少次獲取的都是之前注冊容器中的單實例對象
* @return
*/
@Bean //給容器中添加組件。以方法名作為組件的id。返回類型就是組件類型。返回的值,就是組件在容器中的實例
public User user01(){
User user = new User("zhangSan", 18);
//user組件依賴了Pet組件
user.setPet(tomcatPet());
return user;
}
@Bean("tom")
public Pet tomcatPet(){
return new Pet("tomcat");
}
}
(3)要研究的問題是:@Configuration注解的proxyBeanMethods屬性取值true和false的區別:
- 【Full模式】當proxyBeanMethods=true時,外部無論對配置類中的這個組件注冊方法調用多少次獲取的都是之前注冊容器中的單實例對象,也就是說,保證每個@Bean方法被調用多少次返回的組件都是單例的,所以如果proxyBeanMethods=true時,每次從外部調用@Bean方法時,都會進行判斷操作,判斷容器中是否有這個組件,會比較耗時,也即Full模式
-
【Lite模式】當proxyBeanMethods=false時,每個@Bean方法被調用多少次返回的組件都是新創建的,即,當從外部調用@Bean方法時,不會去判斷容器中是否有這個組件,而是直接新創建一個組件然后返回,比Full模式效率高。
- 總結就是:如果配置類中的組件有依賴關系,則應該使用Full模式,即【proxyBeanMethods=true】,否則應該使用Lite模式,即【proxyBeanMethods=false】
- 補充說明
那自然會想到SpringBoot項目的主配置類也是一個配置類啊,那主配置類使用的是什么模式呢(即:主配置類使用的是Full模式還是Lite模式呢),查看主配置類發現其采用的是Full模式,如下圖:
原文鏈接:https://blog.csdn.net/qq_23388169/article/details/124562098
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-10-11 pytorch加載自己的數據集源碼分享_python
- 2022-03-27 MongoDB的常用命令匯總(Mongo4.2.8)_MongoDB
- 2023-10-10 前端position: absolute是相對于誰定位的?
- 2022-06-17 Go語言讀取,設置Cookie及設置cookie過期方法詳解_Golang
- 2023-12-22 獲取微信小程序版本號,uni
- 2022-07-20 C/C++舉例講解關鍵字的用法_C 語言
- 2022-01-21 Shell編程:/bin/bash和/bin/sh的區別
- 2022-08-03 C++類與對象深入之引用與內聯函數與auto關鍵字及for循環詳解_C 語言
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支