DefaultListableBeanFactory 对配置lazy-init 属性单态Bean 的预实例化
生活随笔
收集整理的這篇文章主要介紹了
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 的预实例化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: finishBeanFactoryIni
- 下一篇: 关于FactoryBean 和BeanF