日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DefaultListableBeanFactory 对配置lazy-init 属性单态Bean 的预实例化

發布時間:2024/4/13 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DefaultListableBeanFactory 对配置lazy-init 属性单态Bean 的预实例化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
//對配置lazy-init屬性單態Bean的預實例化 @Override public void preInstantiateSingletons() throws BeansException {if (this.logger.isDebugEnabled()) {this.logger.debug("Pre-instantiating singletons in " + this);}// Iterate over a copy to allow for init methods which in turn register new bean definitions.// While this may not be part of the regular factory bootstrap, it does otherwise work fine.List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);// Trigger initialization of all non-lazy singleton beans...for (String beanName : beanNames) {//獲取指定名稱的Bean定義RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);//Bean不是抽象的,是單態模式的,且lazy-init屬性配置為falseif (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {//如果指定名稱的bean是創建容器的Beanif (isFactoryBean(beanName)) {//FACTORY_BEAN_PREFIX=”&”,當Bean名稱前面加”&”符號//時,獲取的是產生容器對象本身,而不是容器產生的Bean.//調用getBean方法,觸發容器對Bean實例化和依賴注入過程final FactoryBean<?> factory = (FactoryBean<?>) getBean(FACTORY_BEAN_PREFIX + beanName);//標識是否需要預實例化boolean isEagerInit;if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {//一個匿名內部類isEagerInit = AccessController.doPrivileged((PrivilegedAction<Boolean>) () ->((SmartFactoryBean<?>) factory).isEagerInit(),getAccessControlContext());}else {isEagerInit = (factory instanceof SmartFactoryBean &&((SmartFactoryBean<?>) factory).isEagerInit());}if (isEagerInit) {//調用getBean方法,觸發容器對Bean實例化和依賴注入過程getBean(beanName);}}else {getBean(beanName);}}}// Trigger post-initialization callback for all applicable beans...for (String beanName : beanNames) {Object singletonInstance = getSingleton(beanName);if (singletonInstance instanceof SmartInitializingSingleton) {final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;if (System.getSecurityManager() != null) {AccessController.doPrivileged((PrivilegedAction<Object>) () -> {smartSingleton.afterSingletonsInstantiated();return null;}, getAccessControlContext());}else {smartSingleton.afterSingletonsInstantiated();}}} }

通過對lazy-init 處理源碼的分析,我們可以看出,如果設置了lazy-init 屬性,則容器在完成Bean 定義的注冊之后,會通過getBean 方法,觸發對指定Bean 的初始化和依賴注入過程,這樣當應用第一次向容器索取所需的Bean 時,容器不再需要對Bean 進行初始化和依賴注入,直接從已經完成實例化和依賴注入的Bean 中取一個現成的Bean,這樣就提高了第一次獲取Bean 的性能。

?

?

總結

以上是生活随笔為你收集整理的DefaultListableBeanFactory 对配置lazy-init 属性单态Bean 的预实例化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。