|
|
|
@ -1,5 +1,5 @@ |
|
|
|
/* |
|
|
|
/* |
|
|
|
* Copyright 2002-2019 the original author or authors. |
|
|
|
* Copyright 2002-2020 the original author or authors. |
|
|
|
* |
|
|
|
* |
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
* you may not use this file except in compliance with the License. |
|
|
|
* you may not use this file except in compliance with the License. |
|
|
|
@ -305,7 +305,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac |
|
|
|
public void autowireBean(Object existingBean) { |
|
|
|
public void autowireBean(Object existingBean) { |
|
|
|
// Use non-singleton bean definition, to avoid registering bean as dependent bean.
|
|
|
|
// Use non-singleton bean definition, to avoid registering bean as dependent bean.
|
|
|
|
RootBeanDefinition bd = new RootBeanDefinition(ClassUtils.getUserClass(existingBean)); |
|
|
|
RootBeanDefinition bd = new RootBeanDefinition(ClassUtils.getUserClass(existingBean)); |
|
|
|
bd.setScope(BeanDefinition.SCOPE_PROTOTYPE); |
|
|
|
bd.setScope(SCOPE_PROTOTYPE); |
|
|
|
bd.allowCaching = ClassUtils.isCacheSafe(bd.getBeanClass(), getBeanClassLoader()); |
|
|
|
bd.allowCaching = ClassUtils.isCacheSafe(bd.getBeanClass(), getBeanClassLoader()); |
|
|
|
BeanWrapper bw = new BeanWrapperImpl(existingBean); |
|
|
|
BeanWrapper bw = new BeanWrapperImpl(existingBean); |
|
|
|
initBeanWrapper(bw); |
|
|
|
initBeanWrapper(bw); |
|
|
|
@ -325,7 +325,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac |
|
|
|
bd = new RootBeanDefinition(mbd); |
|
|
|
bd = new RootBeanDefinition(mbd); |
|
|
|
} |
|
|
|
} |
|
|
|
if (!bd.isPrototype()) { |
|
|
|
if (!bd.isPrototype()) { |
|
|
|
bd.setScope(BeanDefinition.SCOPE_PROTOTYPE); |
|
|
|
bd.setScope(SCOPE_PROTOTYPE); |
|
|
|
bd.allowCaching = ClassUtils.isCacheSafe(ClassUtils.getUserClass(existingBean), getBeanClassLoader()); |
|
|
|
bd.allowCaching = ClassUtils.isCacheSafe(ClassUtils.getUserClass(existingBean), getBeanClassLoader()); |
|
|
|
} |
|
|
|
} |
|
|
|
BeanWrapper bw = new BeanWrapperImpl(existingBean); |
|
|
|
BeanWrapper bw = new BeanWrapperImpl(existingBean); |
|
|
|
@ -349,28 +349,27 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac |
|
|
|
public Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException { |
|
|
|
public Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException { |
|
|
|
// Use non-singleton bean definition, to avoid registering bean as dependent bean.
|
|
|
|
// Use non-singleton bean definition, to avoid registering bean as dependent bean.
|
|
|
|
RootBeanDefinition bd = new RootBeanDefinition(beanClass, autowireMode, dependencyCheck); |
|
|
|
RootBeanDefinition bd = new RootBeanDefinition(beanClass, autowireMode, dependencyCheck); |
|
|
|
bd.setScope(BeanDefinition.SCOPE_PROTOTYPE); |
|
|
|
bd.setScope(SCOPE_PROTOTYPE); |
|
|
|
return createBean(beanClass.getName(), bd, null); |
|
|
|
return createBean(beanClass.getName(), bd, null); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException { |
|
|
|
public Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException { |
|
|
|
// Use non-singleton bean definition, to avoid registering bean as dependent bean.
|
|
|
|
// Use non-singleton bean definition, to avoid registering bean as dependent bean.
|
|
|
|
final RootBeanDefinition bd = new RootBeanDefinition(beanClass, autowireMode, dependencyCheck); |
|
|
|
RootBeanDefinition bd = new RootBeanDefinition(beanClass, autowireMode, dependencyCheck); |
|
|
|
bd.setScope(BeanDefinition.SCOPE_PROTOTYPE); |
|
|
|
bd.setScope(SCOPE_PROTOTYPE); |
|
|
|
if (bd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR) { |
|
|
|
if (bd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR) { |
|
|
|
return autowireConstructor(beanClass.getName(), bd, null, null).getWrappedInstance(); |
|
|
|
return autowireConstructor(beanClass.getName(), bd, null, null).getWrappedInstance(); |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
else { |
|
|
|
Object bean; |
|
|
|
Object bean; |
|
|
|
final BeanFactory parent = this; |
|
|
|
|
|
|
|
if (System.getSecurityManager() != null) { |
|
|
|
if (System.getSecurityManager() != null) { |
|
|
|
bean = AccessController.doPrivileged((PrivilegedAction<Object>) () -> |
|
|
|
bean = AccessController.doPrivileged( |
|
|
|
getInstantiationStrategy().instantiate(bd, null, parent), |
|
|
|
(PrivilegedAction<Object>) () -> getInstantiationStrategy().instantiate(bd, null, this), |
|
|
|
getAccessControlContext()); |
|
|
|
getAccessControlContext()); |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
else { |
|
|
|
bean = getInstantiationStrategy().instantiate(bd, null, parent); |
|
|
|
bean = getInstantiationStrategy().instantiate(bd, null, this); |
|
|
|
} |
|
|
|
} |
|
|
|
populateBean(beanClass.getName(), bd, new BeanWrapperImpl(bean)); |
|
|
|
populateBean(beanClass.getName(), bd, new BeanWrapperImpl(bean)); |
|
|
|
return bean; |
|
|
|
return bean; |
|
|
|
@ -387,7 +386,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac |
|
|
|
// Use non-singleton bean definition, to avoid registering bean as dependent bean.
|
|
|
|
// Use non-singleton bean definition, to avoid registering bean as dependent bean.
|
|
|
|
RootBeanDefinition bd = |
|
|
|
RootBeanDefinition bd = |
|
|
|
new RootBeanDefinition(ClassUtils.getUserClass(existingBean), autowireMode, dependencyCheck); |
|
|
|
new RootBeanDefinition(ClassUtils.getUserClass(existingBean), autowireMode, dependencyCheck); |
|
|
|
bd.setScope(BeanDefinition.SCOPE_PROTOTYPE); |
|
|
|
bd.setScope(SCOPE_PROTOTYPE); |
|
|
|
BeanWrapper bw = new BeanWrapperImpl(existingBean); |
|
|
|
BeanWrapper bw = new BeanWrapperImpl(existingBean); |
|
|
|
initBeanWrapper(bw); |
|
|
|
initBeanWrapper(bw); |
|
|
|
populateBean(bd.getBeanClass().getName(), bd, bw); |
|
|
|
populateBean(bd.getBeanClass().getName(), bd, bw); |
|
|
|
@ -523,7 +522,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac |
|
|
|
* @see #instantiateUsingFactoryMethod |
|
|
|
* @see #instantiateUsingFactoryMethod |
|
|
|
* @see #autowireConstructor |
|
|
|
* @see #autowireConstructor |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) |
|
|
|
protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) |
|
|
|
throws BeanCreationException { |
|
|
|
throws BeanCreationException { |
|
|
|
|
|
|
|
|
|
|
|
// Instantiate the bean.
|
|
|
|
// Instantiate the bean.
|
|
|
|
@ -534,7 +533,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac |
|
|
|
if (instanceWrapper == null) { |
|
|
|
if (instanceWrapper == null) { |
|
|
|
instanceWrapper = createBeanInstance(beanName, mbd, args); |
|
|
|
instanceWrapper = createBeanInstance(beanName, mbd, args); |
|
|
|
} |
|
|
|
} |
|
|
|
final Object bean = instanceWrapper.getWrappedInstance(); |
|
|
|
Object bean = instanceWrapper.getWrappedInstance(); |
|
|
|
Class<?> beanType = instanceWrapper.getWrappedClass(); |
|
|
|
Class<?> beanType = instanceWrapper.getWrappedClass(); |
|
|
|
if (beanType != NullBean.class) { |
|
|
|
if (beanType != NullBean.class) { |
|
|
|
mbd.resolvedTargetType = beanType; |
|
|
|
mbd.resolvedTargetType = beanType; |
|
|
|
@ -603,7 +602,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac |
|
|
|
"] in its raw version as part of a circular reference, but has eventually been " + |
|
|
|
"] in its raw version as part of a circular reference, but has eventually been " + |
|
|
|
"wrapped. This means that said other beans do not use the final version of the " + |
|
|
|
"wrapped. This means that said other beans do not use the final version of the " + |
|
|
|
"bean. This is often the result of over-eager type matching - consider using " + |
|
|
|
"bean. This is often the result of over-eager type matching - consider using " + |
|
|
|
"'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example."); |
|
|
|
"'getBeanNamesForType' with the 'allowEagerInit' flag turned off, for example."); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
@ -860,7 +859,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac |
|
|
|
* @return the common {@code FactoryBean} object type, or {@code null} if none |
|
|
|
* @return the common {@code FactoryBean} object type, or {@code null} if none |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
@Nullable |
|
|
|
@Nullable |
|
|
|
private Class<?> getTypeForFactoryBeanFromMethod(Class<?> beanClass, final String factoryMethodName) { |
|
|
|
private Class<?> getTypeForFactoryBeanFromMethod(Class<?> beanClass, String factoryMethodName) { |
|
|
|
class Holder { @Nullable Class<?> value = null; } |
|
|
|
class Holder { @Nullable Class<?> value = null; } |
|
|
|
final Holder objectType = new Holder(); |
|
|
|
final Holder objectType = new Holder(); |
|
|
|
|
|
|
|
|
|
|
|
@ -1206,17 +1205,16 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac |
|
|
|
* @param mbd the bean definition for the bean |
|
|
|
* @param mbd the bean definition for the bean |
|
|
|
* @return a BeanWrapper for the new instance |
|
|
|
* @return a BeanWrapper for the new instance |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
protected BeanWrapper instantiateBean(final String beanName, final RootBeanDefinition mbd) { |
|
|
|
protected BeanWrapper instantiateBean(String beanName, RootBeanDefinition mbd) { |
|
|
|
try { |
|
|
|
try { |
|
|
|
Object beanInstance; |
|
|
|
Object beanInstance; |
|
|
|
final BeanFactory parent = this; |
|
|
|
|
|
|
|
if (System.getSecurityManager() != null) { |
|
|
|
if (System.getSecurityManager() != null) { |
|
|
|
beanInstance = AccessController.doPrivileged((PrivilegedAction<Object>) () -> |
|
|
|
beanInstance = AccessController.doPrivileged( |
|
|
|
getInstantiationStrategy().instantiate(mbd, beanName, parent), |
|
|
|
(PrivilegedAction<Object>) () -> getInstantiationStrategy().instantiate(mbd, beanName, this), |
|
|
|
getAccessControlContext()); |
|
|
|
getAccessControlContext()); |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
else { |
|
|
|
beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent); |
|
|
|
beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, this); |
|
|
|
} |
|
|
|
} |
|
|
|
BeanWrapper bw = new BeanWrapperImpl(beanInstance); |
|
|
|
BeanWrapper bw = new BeanWrapperImpl(beanInstance); |
|
|
|
initBeanWrapper(bw); |
|
|
|
initBeanWrapper(bw); |
|
|
|
@ -1663,7 +1661,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac |
|
|
|
* @see #invokeInitMethods |
|
|
|
* @see #invokeInitMethods |
|
|
|
* @see #applyBeanPostProcessorsAfterInitialization |
|
|
|
* @see #applyBeanPostProcessorsAfterInitialization |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) { |
|
|
|
protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) { |
|
|
|
if (System.getSecurityManager() != null) { |
|
|
|
if (System.getSecurityManager() != null) { |
|
|
|
AccessController.doPrivileged((PrivilegedAction<Object>) () -> { |
|
|
|
AccessController.doPrivileged((PrivilegedAction<Object>) () -> { |
|
|
|
invokeAwareMethods(beanName, bean); |
|
|
|
invokeAwareMethods(beanName, bean); |
|
|
|
@ -1694,7 +1692,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac |
|
|
|
return wrappedBean; |
|
|
|
return wrappedBean; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void invokeAwareMethods(final String beanName, final Object bean) { |
|
|
|
private void invokeAwareMethods(String beanName, Object bean) { |
|
|
|
if (bean instanceof Aware) { |
|
|
|
if (bean instanceof Aware) { |
|
|
|
if (bean instanceof BeanNameAware) { |
|
|
|
if (bean instanceof BeanNameAware) { |
|
|
|
((BeanNameAware) bean).setBeanName(beanName); |
|
|
|
((BeanNameAware) bean).setBeanName(beanName); |
|
|
|
@ -1723,7 +1721,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac |
|
|
|
* @throws Throwable if thrown by init methods or by the invocation process |
|
|
|
* @throws Throwable if thrown by init methods or by the invocation process |
|
|
|
* @see #invokeCustomInitMethod |
|
|
|
* @see #invokeCustomInitMethod |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
protected void invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd) |
|
|
|
protected void invokeInitMethods(String beanName, Object bean, @Nullable RootBeanDefinition mbd) |
|
|
|
throws Throwable { |
|
|
|
throws Throwable { |
|
|
|
|
|
|
|
|
|
|
|
boolean isInitializingBean = (bean instanceof InitializingBean); |
|
|
|
boolean isInitializingBean = (bean instanceof InitializingBean); |
|
|
|
@ -1764,12 +1762,12 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac |
|
|
|
* methods with arguments. |
|
|
|
* methods with arguments. |
|
|
|
* @see #invokeInitMethods |
|
|
|
* @see #invokeInitMethods |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
protected void invokeCustomInitMethod(String beanName, final Object bean, RootBeanDefinition mbd) |
|
|
|
protected void invokeCustomInitMethod(String beanName, Object bean, RootBeanDefinition mbd) |
|
|
|
throws Throwable { |
|
|
|
throws Throwable { |
|
|
|
|
|
|
|
|
|
|
|
String initMethodName = mbd.getInitMethodName(); |
|
|
|
String initMethodName = mbd.getInitMethodName(); |
|
|
|
Assert.state(initMethodName != null, "No init method set"); |
|
|
|
Assert.state(initMethodName != null, "No init method set"); |
|
|
|
final Method initMethod = (mbd.isNonPublicAccessAllowed() ? |
|
|
|
Method initMethod = (mbd.isNonPublicAccessAllowed() ? |
|
|
|
BeanUtils.findMethod(bean.getClass(), initMethodName) : |
|
|
|
BeanUtils.findMethod(bean.getClass(), initMethodName) : |
|
|
|
ClassUtils.getMethodIfAvailable(bean.getClass(), initMethodName)); |
|
|
|
ClassUtils.getMethodIfAvailable(bean.getClass(), initMethodName)); |
|
|
|
|
|
|
|
|
|
|
|
@ -1798,8 +1796,8 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac |
|
|
|
return null; |
|
|
|
return null; |
|
|
|
}); |
|
|
|
}); |
|
|
|
try { |
|
|
|
try { |
|
|
|
AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> |
|
|
|
AccessController.doPrivileged((PrivilegedExceptionAction<Object>) |
|
|
|
initMethod.invoke(bean), getAccessControlContext()); |
|
|
|
() -> initMethod.invoke(bean), getAccessControlContext()); |
|
|
|
} |
|
|
|
} |
|
|
|
catch (PrivilegedActionException pae) { |
|
|
|
catch (PrivilegedActionException pae) { |
|
|
|
InvocationTargetException ex = (InvocationTargetException) pae.getException(); |
|
|
|
InvocationTargetException ex = (InvocationTargetException) pae.getException(); |
|
|
|
|