选择Bean 实例化策略
生活随笔
收集整理的這篇文章主要介紹了
选择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 实例化策略的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开始实例化
- 下一篇: 执行Bean 实例化