spring加载过程-实例化初始化

首先从getBean()方法开始

=首先丛缓存中获取单例bean

public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
private final Map<String, Object> singletonObjects = new ConcurrentHashMap(256);
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
// 先从缓存中获取bean,处理已经被创建的单例模式的bean,
    Object singletonObject = this.singletonObjects.get(beanName);
    if(singletonObject == null && this.isSingletonCurrentlyInCreation(beanName)) {
        Map var4 = this.singletonObjects;
        synchronized(this.singletonObjects) {
            singletonObject = this.earlySingletonObjects.get(beanName);
            if(singletonObject == null && allowEarlyReference) {
                ObjectFactory<?> singletonFactory = (ObjectFactory)this.singletonFactories.get(beanName);
                if(singletonFactory != null) {
                    singletonObject = singletonFactory.getObject();
                    this.earlySingletonObjects.put(beanName, singletonObject);
                    this.singletonFactories.remove(beanName);
                }
            }
        }
    }

}

丛缓存中获取不为空 bean实例之后就是getObjectForBeanInstance()方法进行处理

意义:

  • 无论是从缓存中获得bean还是根据不同的scope策略加载bean,都需要在得到bean实例后调用getObjectForBeanInstance方法来检测一下正确性;即检测当前bean是否是FactoryBean类型的bean,如果是,那么需要调用该bean对应的FactoryBean实例中的getObject()方法作为返回值。

  • 无论是从缓存中获取的bean还是通过不同scope策略加载的bean都只是原始的bean状态,并不一定是我们最终想要的bean,举个例子,假如我们需要对工厂bean进行处理,那么这里得到的其实是工厂bean的初始状态,但是我们真正需要的是工厂bean中定义的factory-method方法中返回的bean,而getObjectForBeanInstance方法就是完成这个工作的。


 

对 Bean 进行实例化处理,原因如下
bean = this.getObjectForBeanInstance(sharedInstance, name, beanName, (RootBeanDefinition)null);

1.用于检测是否是FactoryBean与工厂相关,不是就抛出异常

2.缓存中记录的是最原始的 Bean 状态,得到的不一定是我们最终想要的 Bean 。

protected Object getObjectForBeanInstance(Object beanInstance, String name, String beanName, RootBeanDefinition mbd) {
    if(BeanFactoryUtils.isFactoryDereference(name) && !(beanInstance instanceof FactoryBean)) {
        throw new BeanIsNotAFactoryException(this.transformedBeanName(name), beanInstance.getClass());
    } else if(beanInstance instanceof FactoryBean && !BeanFactoryUtils.isFactoryDereference(name)) {
        Object object = null;
        if(mbd == null) {
            object = this.getCachedObjectForFactoryBean(beanName);
        }

        if(object == null) {//若 object 依然为空,则可以确认,beanInstance 一定是 FactoryBean 。从而,使用 FactoryBean 获得 Bean 对象
            FactoryBean<?> factory = (FactoryBean)beanInstance;
            if(mbd == null && this.containsBeanDefinition(beanName)) {
            / 将存储 XML 配置文件的 GenericBeanDefinition 转换为 RootBeanDefinition,
            // 如果指定 BeanName 是子 Bean 的话同时会合并父类的相关属性
                mbd = this.getMergedLocalBeanDefinition(beanName);
            }

            boolean synthetic = mbd != null && mbd.isSynthetic();

              //核心处理方法,使用 FactoryBean 获得 Bean 对象
            object = this.getObjectFromFactoryBean(factory, beanName, !synthetic);
        }

        return object;
    } else {
        return beanInstance;
    }
}

大致意思就是先判断是否FactoryBean或者是带&bean 是就抛出异常

不是就,开始从缓存中拿出bean,(其实就是从缓存map中拿出的)

protected Object getCachedObjectForFactoryBean(String beanName) {
    Object object = this.factoryBeanObjectCache.get(beanName);
    return object != NULL_OBJECT?object:null;
}

如果缓存中缓存中没有拿出,则可以确认,beanInstance 一定是 FactoryBean 。因为这个是后的bean都是FactoryBean创建的

接下来看看核心的方法getObjectFromFactoryBean

 

public abstract class FactoryBeanRegistrySupport extends DefaultSingletonBeanRegistry {
    private final Map<String, Object> factoryBeanObjectCache = new ConcurrentHashMap(16);protected Object getObjectFromFactoryBean(FactoryBean<?> factory, String beanName, boolean shouldPostProcess) {

//先从缓存中获取对象,

 Object object = this.factoryBeanObjectCache.get(beanName);

如果为空就用FactoryBean创建对象

调用do,,,方法

    this.beforeSingletonCreation(beanName);//bean单例的前置处理

    try {
//从 FactoryBean 处获取的 Bean 实例对象进行后置处理。其默认实现是直接返回 object 对象,不做任何处理。
        object = this.postProcessObjectFromFactoryBean(object, beanName);
    } catch (Throwable var14) {
        throw new BeanCreationException(beanName, "Post-processing of FactoryBean's singleton object failed", var14);
    } finally {
        this.afterSingletonCreation(beanName);//bean单例的后置处理
    }
}

}}

上面的步骤是创建单例。

如果没有没有获取到单例

 

BeanFactory parentBeanFactory = this.getParentBeanFactory();//如果容器中没有找到,则从父类容器中加载final 

//从容器中获取 beanName 相应的 GenericBeanDefinition 对象,并将其转换为 RootBeanDefinition 对象
RootBeanDefinition mbd = this.getMergedLocalBeanDefinition(beanName);
 // 检查给定的合并的 BeanDefinition
this.checkMergedBeanDefinition(mbd, beanName, args);

String[] dependsOn = mbd.getDependsOn();//处理所依赖的 bean
String[] var11;
if(dependsOn != null) {
    var11 = dependsOn;
    int var12 = dependsOn.length;

    for(int var13 = 0; var13 < var12; ++var13) {
        String dep = var11[var13];
        if(this.isDependent(beanName, dep)) {
            throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
        }

        this.registerDependentBean(dep, beanName);

        try {
            this.getBean(dep);
        } catch (NoSuchBeanDefinitionException var24) {
            throw new BeanCreationException(mbd.getResourceDescription(), beanName, "'" + beanName + "' depends on missing bean '" + dep + "'", var24);
        }
    }
}

----------------------------------------------------------------------------------------------------------------------------------------------------

上面是从缓存中得到对象

但是缓存中得不到,就要spring自己就要从头开始创建对象

if(mbd.isSingleton()) {
    sharedInstance = this.getSingleton(beanName, new ObjectFactory<Object>() {
        public Object getObject() throws BeansException {
            try {
                return AbstractBeanFactory.this.createBean(beanName, mbd, args);
            } catch (BeansException var2) {
                AbstractBeanFactory.this.destroySingleton(beanName);
                throw var2;
            }
        }
    });
    bean = this.getObjectForBeanInstance(sharedInstance, name, beanName, mbd);

}

createBean主要是不同scope下的bean的创建

protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {

  Object beanInstance;
        try {
            beanInstance = this.resolveBeforeInstantiation(beanName, mbdToUse);//1
            if(beanInstance != null) {
                return beanInstance;
            }

beanInstance = this.doCreateBean(beanName, mbdToUse, args);//2
if(this.logger.isDebugEnabled()) {
    this.logger.debug("Finished creating instance of bean '" + beanName + "'");
}

return beanInstance;

}

(1)实例化前置处理

public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory 

protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
        Object bean = null;
        if(!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
            if(!mbd.isSynthetic() && this.hasInstantiationAwareBeanPostProcessors()) {
                Class<?> targetType = this.determineTargetType(beanName, mbd, new Class[0]);
                if(targetType != null) {//初始化前置处理
                    bean = this.applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
                    if(bean != null) {//初始化后置处理
                        bean = this.applyBeanPostProcessorsAfterInitialization(bean, beanName);
                    }
                }
            }

            mbd.beforeInstantiationResolved = Boolean.valueOf(bean != null);
        }

        return bean;
    }

(2)给 BeanPostProcessors 一个机会用来返回一个代理类而不是真正的类实例
        // AOP 的功能就是基于这个地方

protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, Object[] args) throws BeanCreationException {
    BeanWrapper instanceWrapper = null;
    if(mbd.isSingleton()) {//如果是单例模型,就移除
        instanceWrapper = (BeanWrapper)this.factoryBeanInstanceCache.remove(beanName);
    }
  
        instanceWrapper = this.createBeanInstance(beanName, mbd, args);//进行包装
    }

createBeanInstance创建bean实例

protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) {
    Class<?> beanClass = this.resolveBeanClass(mbd, beanName, new Class[0]);
    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());
    } else if(mbd.getFactoryMethodName() != null) {
        return this.instantiateUsingFactoryMethod(beanName, mbd, args);
    } else {
        boolean resolved = false;
        boolean autowireNecessary = false;
        if(args == null) {
            Object var7 = mbd.constructorArgumentLock;
            synchronized(mbd.constructorArgumentLock) {
                if(mbd.resolvedConstructorOrFactoryMethod != null) {
                    resolved = true;
                    autowireNecessary = mbd.constructorArgumentsResolved;
                }
            }
        }

        if(resolved) {
            return autowireNecessary?this.autowireConstructor(beanName, mbd, (Constructor[])null, (Object[])null):this.instantiateBean(beanName, mbd);
        } else {
            Constructor<?>[] ctors = this.determineConstructorsFromBeanPostProcessors(beanClass, beanName);
            return ctors == null && mbd.getResolvedAutowireMode() != 3 && !mbd.hasConstructorArgumentValues() && 
           ObjectUtils.isEmpty(args)?this.instantiateBean(beanName, mbd):this.autowireConstructor(beanName, mbd, ctors, args);
        }
    }
}

//将 bean 类名解析为 class 引用

Class<?> beanClass = this.resolveBeanClass(mbd, beanName, new Class[0]);//成为了beanClass

太难了。。。

}

//重点

instantiateUsingFactoryMethod()//首先初始化工厂方法

这个需要配置静态方法

静态工厂方式就是指Factory类不本身不需要实例化, 这个Factory类中提供了1个静态方法来生成bean对象

所以就是carFactory的工厂实例化出来一个人

 

(2)然后是 有参数构造函数的实例化autowireConstructor(复杂)

和无参数的方法实例化instantiateBean ,没有其他的逻辑代码,直接调用实例化策略进行bean的实例化

InstantiationStrategy 接口定义了 Spring Bean 实例化的策略,根据创建对象情况的不同,提供了三种策略:无参构造方法、有参构造方法、工厂方法。代码如下:

public interface InstantiationStrategy {

    /**
    * 默认构造方法
    */
    Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner)
    throws BeansException;
    
    /**
    * 指定构造方法
    */
    Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner,
    Constructor<?> ctor, @Nullable Object... args) throws BeansException;
    
    /**
    * 工厂方法
    */
    Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner,
    @Nullable Object factoryBean, Method factoryMethod, @Nullable Object... args)
    throws BeansException;

}

InstantiationStrategy 接口有两个实现类:SimpleInstantiationStrategy 和 CglibSubclassingInstantiationStrategy。

SimpleInstantiationStrategy 对以上三个方法都做了简单的实现。

instantiateUsingFactoryMethod和instantiateBean都会用到初始化策略

// SimpleInstantiationStrategy.java 如果是工厂方法实例化,则直接使用反射创建对象。

public Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner,
        @Nullable Object factoryBean, final Method factoryMethod, Object... args) {
  // 获得原 Method 对象
        Method priorInvokedFactoryMethod = currentlyInvokedFactoryMethod.get();
        try {
            // 设置新的 Method 对象,到 currentlyInvokedFactoryMethod 中
            currentlyInvokedFactoryMethod.set(factoryMethod);
            // 创建 Bean 对象
            Object result = factoryMethod.invoke(factoryBean, args);
            // 未创建,则创建 NullBean 对象
            if (result == null) {
                result = new NullBean();
            }
            return result;
        } finally {
            // 设置老的 Method 对象,到 currentlyInvokedFactoryMethod 中
            if (priorInvokedFactoryMethod != null) {
                currentlyInvokedFactoryMethod.set(priorInvokedFactoryMethod);
            } else {
                currentlyInvokedFactoryMethod.remove();
            }
        }

}

 如果是构造方法实例化,则是先判断是否有 MethodOverrides,如果没有则是直接使用反射,如果有则就需要 CGLIB 实例化对象。

// 默认构造方法
@Override
public Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner) {
	// Don't override the class with CGLIB if no overrides.
    // 没有覆盖,直接使用反射实例化即可
    if (!bd.hasMethodOverrides()) {
		Constructor<?> constructorToUse;
		synchronized (bd.constructorArgumentLock) {
		    // 获得构造方法 constructorToUse
			constructorToUse = (Constructor<?>) bd.resolvedConstructorOrFactoryMethod;
			if (constructorToUse == null) {
				final Class<?> clazz = bd.getBeanClass();
				// 如果是接口,抛出 BeanInstantiationException 异常
				if (clazz.isInterface()) {
					throw new BeanInstantiationException(clazz, "Specified class is an interface");
				}
				try {
				    // 从 clazz 中,获得构造方法
					if (System.getSecurityManager() != null) { // 安全模式
						constructorToUse = AccessController.doPrivileged(
								(PrivilegedExceptionAction<Constructor<?>>) clazz::getDeclaredConstructor);
					} else {
						constructorToUse =	clazz.getDeclaredConstructor();
					}
					// 标记 resolvedConstructorOrFactoryMethod 属性
					bd.resolvedConstructorOrFactoryMethod = constructorToUse;
				} catch (Throwable ex) {
					throw new BeanInstantiationException(clazz, "No default constructor found", ex);
				}
			}
		}
        // 通过 BeanUtils 直接使用构造器对象实例化 Bean 对象
        return BeanUtils.instantiateClass(constructorToUse);
	} else {
		// Must generate CGLIB subclass.
        // 生成 CGLIB 创建的子类对象
        return instantiateWithMethodInjection(bd, beanName, owner);
	}
}

// 指定构造方法
@Override
public Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner,
		final Constructor<?> ctor, Object... args) {
    // 没有覆盖,直接使用反射实例化即可
	if (!bd.hasMethodOverrides()) {
		if (System.getSecurityManager() != null) {
		    // 设置构造方法,可访问
			// use own privileged to change accessibility (when security is on)
			AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
				ReflectionUtils.makeAccessible(ctor);
				return null;
			});
		}
        // 通过 BeanUtils 直接使用构造器对象实例化 Bean 对象
		return BeanUtils.instantiateClass(ctor, args);
	} else {
        // 生成 CGLIB 创建的子类对象
		return instantiateWithMethodInjection(bd, beanName, owner, ctor, args);
	}
}

调用工具类 BeanUtils 的 #instantiateClass(Constructor<T> ctor, Object... args) 方法,完成反射工作,创建对象。代码如下:

// BeanUtils.java

public static <T> T instantiateClass(Constructor<T> ctor, Object... args) throws BeanInstantiationException {
    Assert.notNull(ctor, "Constructor must not be null");
    try {
        // 设置构造方法,可访问
        ReflectionUtils.makeAccessible(ctor);
        // 使用构造方法,创建对象
        return (KotlinDetector.isKotlinReflectPresent() && KotlinDetector.isKotlinType(ctor.getDeclaringClass()) ?
                KotlinDelegate.instantiateClass(ctor, args) : ctor.newInstance(args));
    // 各种异常的翻译,最终统一抛出 BeanInstantiationException 异常
   
}
对于 #createBeanInstance(...) 方法而言,他就是选择合适实例化策略来为 bean 创建实例对象,具体的策略有:

Supplier 回调方式
工厂方法初始化
构造函数自动注入初始化
默认构造函数注入。

CGLIB实例化bean策略


// CglibSubclassingInstantiationStrategy.java

@Override
protected Object instantiateWithMethodInjection(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner) {
    return instantiateWithMethodInjection(bd, beanName, owner, null);
}
@Override
protected Object instantiateWithMethodInjection(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner, @Nullable Constructor<?> ctor, Object... args) {
    // Must generate CGLIB subclass...
    // 通过CGLIB生成一个子类对象
    return new CglibSubclassCreator(bd, owner).instantiate(ctor, args);
}

/ CglibSubclassingInstantiationStrategy.java

public Object instantiate(@Nullable Constructor<?> ctor, Object... args) {
    // 通过 Cglib 创建一个代理类
    Class<?> subclass = createEnhancedSubclass(this.beanDefinition);
    Object instance;
    // 没有构造器,通过 BeanUtils 使用默认构造器创建一个bean实例
    if (ctor == null) {
        instance = BeanUtils.instantiateClass(subclass);
    } else {
        try {
            // 获取代理类对应的构造器对象,并实例化 bean
            Constructor<?> enhancedSubclassConstructor = subclass.getConstructor(ctor.getParameterTypes());
            instance = enhancedSubclassConstructor.newInstance(args);
        } catch (Exception ex) {
            throw new BeanInstantiationException(this.beanDefinition.getBeanClass(),
                    "Failed to invoke constructor for CGLIB enhanced subclass [" + subclass.getName() + "]", ex);
        }
    }
    // SPR-10785: set callbacks directly on the instance instead of in the
    // enhanced class (via the Enhancer) in order to avoid memory leaks.
    // 为了避免 memory leaks 异常,直接在 bean 实例上设置回调对象
    Factory factory = (Factory) instance;
    factory.setCallbacks(new Callback[] {NoOp.INSTANCE,
            new LookupOverrideMethodInterceptor(this.beanDefinition, this.owner),
            new ReplaceOverrideMethodInterceptor(this.beanDefinition, this.owner)});
    return instance;
}

 

doCreateBean()方法里面还有属性填充

1.doCreateBean(...) 方法,主要用于完成 bean 的创建和初始化工作,我们可以将其分为四个过程:

2.createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) 方法,实例化 bean 。

3.循环依赖的处理。

4.populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) 方法,进行属性填充。

5.initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) 方法,初始化 Bean 

Object exposedObject = bean;
try {
   populateBean(beanName, mbd, instanceWrapper);
   if (exposedObject != null) {
      exposedObject = initializeBean(beanName, exposedObject, mbd);
   }
}
protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) {//属性填充
该函数的作用是将 BeanDefinition 中的属性值赋值给 BeanWrapper 实例对象


}

过程中涉及到两个方法

rotected void autowireByName(String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) {
    String[] propertyNames = this.unsatisfiedNonSimpleProperties(mbd, bw);
    String[] var6 = propertyNames;
    int var7 = propertyNames.length;

    for(int var8 = 0; var8 < var7; ++var8) {
        String propertyName = var6[var8];
        if(this.containsBean(propertyName)) {
            Object bean = this.getBean(propertyName);
            pvs.add(propertyName, bean);
            this.registerDependentBean(propertyName, beanName);
            if(this.logger.isDebugEnabled()) {
                this.logger.debug("Added autowiring by name from bean name '" + beanName + "' via property '" + propertyName + "' to bean named '" + propertyName + "'");
            }
        } else if(this.logger.isTraceEnabled()) {
            this.logger.trace("Not autowiring property '" + propertyName + "' of bean '" + beanName + "' by name: no matching bean found");
        }
    }

}
protected void autowireByName(String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) {//通过类型自动注入

具体看源码

}

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

spring循环依赖的问题

beanA创建的时候依赖beanB

beanB创建的时候依赖beanC

beanC创建的时候依赖beanA

解决方法:

public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
private final Map<String, Object> singletonObjects = new ConcurrentHashMap(256);
 private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap(16); 
  private final Map<String, Object> earlySingletonObjects = new HashMap(16);

    protected Object getSingleton(String beanName, boolean allowEarlyReference) {
        Object singletonObject = this.singletonObjects.get(beanName);
        if(singletonObject == null && this.isSingletonCurrentlyInCreation(beanName)) {
            Map var4 = this.singletonObjects;
            synchronized(this.singletonObjects) {
                singletonObject = this.earlySingletonObjects.get(beanName);
                if(singletonObject == null && allowEarlyReference) {
                    ObjectFactory<?> singletonFactory = (ObjectFactory)this.singletonFactories.get(beanName);
                    if(singletonFactory != null) {
                        singletonObject = singletonFactory.getObject();
                        this.earlySingletonObjects.put(beanName, singletonObject);
                        this.singletonFactories.remove(beanName);
                    }
                }
            }
        }

        return singletonObject != NULL_OBJECT?singletonObject:null;
    }
singletonObjects :单例对象的 map Cache 。
singletonFactories : 单例对象工厂的map Cache 。
earlySingletonObjects :提前曝光的单例对象的map Cache 。

大意是先从单例缓存中中获取实例,没有就从提早曝光的单例对象中获取,还是没有获取到就从单例工厂中获取

获取到了就加入早曝光的单例对象中,从单例工厂移除。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

一个容器中bean经过创建和属性注入,但是我们用bean的时候还要进行初始化操作

public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory {
Object exposedObject = bean;

try {
    this.populateBean(beanName, mbd, instanceWrapper);

    if(exposedObject != null) {
        exposedObject = this.initializeBean(beanName, exposedObject, mbd);

    }

}

protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {
 .......
this.invokeAwareMethods(beanName, bean);

    Object wrappedBean = bean;

    if(mbd == null || !mbd.isSynthetic()) {//初始化后置处理器before的应用
        wrappedBean = this.applyBeanPostProcessorsBeforeInitialization(bean, beanName);//1
    }

......
    if(mbd == null || !mbd.isSynthetic()) {//初始化后置处理器after的应用
        wrappedBean = this.applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);//2
    }

    return wrappedBean;
}

初始化前后置处理的类为AbstractAutowireCapableBeanFactory

(1)before
protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
    Iterator var3 = this.getBeanPostProcessors().iterator();

    while(var3.hasNext()) {
        BeanPostProcessor bp = (BeanPostProcessor)var3.next();
        if(bp instanceof InstantiationAwareBeanPostProcessor) {
            InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor)bp;
            Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
            if(result != null) {
                return result;
            }
        }
    }

(2)

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值