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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

选择Bean 实例化策略

發布時間:2024/4/13 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 选择Bean 实例化策略 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在createBeanInstance()方法中,根據指定的初始化策略,使用簡單工廠、工廠方法或者容器的自動裝配特性生成Java 實例對象,創建對象的源碼如下:

//創建Bean的實例對象 protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {// Make sure bean class is actually resolved at this point.//檢查確認Bean是可實例化的Class<?> beanClass = resolveBeanClass(mbd, beanName);//使用工廠方法對Bean進行實例化if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) {throw new BeanCreationException(mbd.getResourceDescription(), beanName,"Bean class isn't public, and non-public access not allowed: " + beanClass.getName());}Supplier<?> instanceSupplier = mbd.getInstanceSupplier();if (instanceSupplier != null) {return obtainFromSupplier(instanceSupplier, beanName);}if (mbd.getFactoryMethodName() != null) {//調用工廠方法實例化return instantiateUsingFactoryMethod(beanName, mbd, args);}// Shortcut when re-creating the same bean...//使用容器的自動裝配方法進行實例化boolean resolved = false;boolean autowireNecessary = false;if (args == null) {synchronized (mbd.constructorArgumentLock) {if (mbd.resolvedConstructorOrFactoryMethod != null) {resolved = true;autowireNecessary = mbd.constructorArgumentsResolved;}}}if (resolved) {if (autowireNecessary) {//配置了自動裝配屬性,使用容器的自動裝配實例化//容器的自動裝配是根據參數類型匹配Bean的構造方法return autowireConstructor(beanName, mbd, null, null);}else {//使用默認的無參構造方法實例化return instantiateBean(beanName, mbd);}}// Need to determine the constructor...//使用Bean的構造方法進行實例化Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);if (ctors != null ||mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR ||mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {//使用容器的自動裝配特性,調用匹配的構造方法實例化return autowireConstructor(beanName, mbd, ctors, args);}// No special handling: simply use no-arg constructor.//使用默認的無參構造方法實例化return instantiateBean(beanName, mbd); } //使用默認的無參構造方法實例化Bean對象 protected BeanWrapper instantiateBean(final String beanName, final RootBeanDefinition mbd) {try {Object beanInstance;final BeanFactory parent = this;//獲取系統的安全管理接口,JDK標準的安全管理APIif (System.getSecurityManager() != null) {//這里是一個匿名內置類,根據實例化策略創建實例對象beanInstance = AccessController.doPrivileged((PrivilegedAction<Object>) () ->getInstantiationStrategy().instantiate(mbd, beanName, parent),getAccessControlContext());}else {//將實例化的對象封裝起來beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent);}BeanWrapper bw = new BeanWrapperImpl(beanInstance);initBeanWrapper(bw);return bw;}catch (Throwable ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Instantiation of bean failed", ex);} }

經過對上面的代碼分析,我們可以看出,對使用工廠方法和自動裝配特性的Bean 的實例化相當比較清楚,調用相應的工廠方法或者參數匹配的構造方法即可完成實例化對象的工作,但是對于我們最常使用的默認無參構造方法就需要使用相應的初始化策略(JDK 的反射機制或者CGLib)來進行初始化了,在方法getInstantiationStrategy().instantiate()中就具體實現類使用初始策略實例化對象。

?

總結

以上是生活随笔為你收集整理的选择Bean 实例化策略的全部內容,希望文章能夠幫你解決所遇到的問題。

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