package org.theonefx.wcframework.ioc;
import org.theonefx.wcframework.ioc.val.ConstructorArgumentValues;
import org.theonefx.wcframework.ioc.val.MutablePropertyValues;
import org.theonefx.wcframework.utils.StringUtils;
/**
* @File : BeanDefinitionSupport.java
* @ClassName : BeanDefinitionSupport
* @Author : 陈曦
* @Date : 2012-2-7 下午05:49:58
* @Version : v1.0
* @Description : Bean定义支持类,提供bean定义基础属性的读写方法
*/
public abstract class BeanDefinitionSupport implements BeanDefinition {
public BeanDefinitionSupport() {
}
public BeanDefinitionSupport(BeanDefinition original) {
setBeanClassName(original.getBeanClassName());
setFactoryBeanName(original.getFactoryBeanName());
setFactoryMethodName(original.getFactoryMethodName());
setScope(original.getScope());
setLazyInit(original.isLazyInit());
setConstructorArgumentValues(new ConstructorArgumentValues(original.getConstructorArgumentValues()));
setPropertyValues(new MutablePropertyValues(original.getPropertyValues()));
if (original instanceof BeanDefinitionSupport) {
BeanDefinitionSupport originalAbd = (BeanDefinitionSupport) original;
if (originalAbd.hasBeanClass()) {
setBeanClass(originalAbd.getBeanClass());
}
setInitMethodName(originalAbd.getInitMethodName());
setHasInitMethod(originalAbd.hasInitMethod);
setDependsOn(originalAbd.getDependsOn());
}
}
private boolean lazyInit;
private String scope;
private String beanClassName;
private String factoryBeanName;
private String factoryMethodName;
private volatile Object beanClass;
private String[] dependsOn;
private ConstructorArgumentValues constructorArgumentValues;
private MutablePropertyValues propertyValues;
private String initMethodName;
private boolean hasInitMethod = false;
/** Package-visible field for caching the resolved constructor or factory method */
Object resolvedConstructorOrFactoryMethod;
/** Package-visible field that marks the constructor arguments as resolved */
boolean constructorArgumentsResolved = false;
/** Package-visible field for caching fully resolved constructor arguments */
Object[] resolvedConstructorArguments;
/** Package-visible field for caching partly prepared constructor arguments */
Object[] preparedConstructorArguments;
final Object constructorArgumentLock = new Object();
/** Package-visible field that indicates a before-instantiation post-processor having kicked in */
volatile Boolean beforeInstantiationResolved;
/** Package-visible field that indicates MergedBeanDefinitionPostProcessor having been applied */
boolean postProcessed = false;
final Object postProcessingLock = new Object();
public String getInitMethodName() {
return initMethodName;
}
public void setHasInitMethod(boolean hasInitMethod) {
this.hasInitMethod = hasInitMethod;
}
public void setInitMethodName(String initMethodName) {
if(StringUtils.isNotBlank(initMethodName)){
hasInitMethod = true;
}
this.initMethodName = initMethodName;
}
public boolean hasBeanClass() {
return (this.beanClass instanceof Class);
}
public void setBeanClass(Class<?> beanClass) {
this.beanClass = beanClass;
this.beanClassName = beanClass.getName();
}
public Class<?> getBeanClass() throws IllegalStateException {
Object beanClassObject = this.beanClass;
if (beanClassObject == null) {
throw new IllegalStateException("没有定义BeanClass");
}
if (!(beanClassObject instanceof Class)) {
throw new IllegalStateException("Bean class name [" + beanClassObject + "] has not been resolved into an actual Class");
}
return (Class<?>) beanClassObject;
}
public void setDependsOn(String[] dependsOn) {
this.dependsOn = dependsOn;
}
public String[] getDependsOn() {
return this.dependsOn;
}
public boolean hasInitMethod() {
return hasInitMethod;
}
/**
* Specify constructor argument values for this bean.
*/
public void setConstructorArgumentValues(ConstructorArgumentValues constructorArgumentValues) {
this.constructorArgumentValues =
(constructorArgumentValues != null ? constructorArgumentValues : new ConstructorArgumentValues());
}
/**
* Return constructor argument values for this bean (never <code>null</code>).
*/
public ConstructorArgumentValues getConstructorArgumentValues() {
return this.constructorArgumentValues;
}
/**
* Return if there are constructor argument values defined for this bean.
*/
public boolean hasConstructorArgumentValues() {
return this.constructorArgumentValues != null && !this.constructorArgumentValues.isEmpty();
}
/**
* Specify property values for this bean, if any.
*/
public void setPropertyValues(MutablePropertyValues propertyValues) {
this.propertyValues = (propertyValues != null ? propertyValues : new MutablePropertyValues());
}
/**
* Return property values for this bean (never <code>null</code>).
*/
public MutablePropertyValues getPropertyValues() {
return this.propertyValues;
}
@Override
public boolean isLazyInit() {
return lazyInit;
}
@Override
public void setLazyInit(boolean lazyInit) {
this.lazyInit = lazyInit;
}
@Override
public String getScope() {
return scope;
}
@Override
public void setScope(String scope) {
this.scope = scope;
}
@Override
public String getBeanClassName() {
return beanClassName;
}
@Override
public void setBeanClassName(String beanClassName) {
this.beanClassName = beanClassName;
}
@Override
public String getFactoryBeanName() {
return factoryBeanName;
}
@Override
public void setFactoryBeanName(String factoryBeanName) {
this.factoryBeanName = factoryBeanName;
}
@Override
public String getFactoryMethodName() {
return factoryMethodName;
}
@Override
public void setFactoryMethodName(String factoryMethodName) {
this.factoryMethodName = factoryMethodName;
}
@Override
public boolean isSingleton() {
return SCOPE_SINGLETON.equals(scope);
}
@Override
public boolean isPrototype() {
return SCOPE_PROTOTYPE.equals(scope);
}
@Override
public Object getSource() {
return null;
}
}