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; } }