📄 abstractbeandefinition.java
字号:
/*
* Copyright 2002-2004 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.beans.factory.support;
import java.lang.reflect.Constructor;
import java.util.Iterator;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConstructorArgumentValues;
import org.springframework.util.ClassUtils;
/**
* Base class for bean definition objects, factoring out common
* properties of RootBeanDefinition and ChildBeanDefinition.
*
* <p>The autowire constants match the ones defined in the
* AutowireCapableBeanFactory interface, adding AUTOWIRE_NO.
*
* @author Rod Johnson
* @author Juergen Hoeller
* @see RootBeanDefinition
* @see ChildBeanDefinition
*/
public abstract class AbstractBeanDefinition implements BeanDefinition {
public static final int AUTOWIRE_NO = 0;
public static final int AUTOWIRE_BY_NAME = AutowireCapableBeanFactory.AUTOWIRE_BY_NAME;
public static final int AUTOWIRE_BY_TYPE = AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE;
public static final int AUTOWIRE_CONSTRUCTOR = AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR;
public static final int AUTOWIRE_AUTODETECT = AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT;
public static final int DEPENDENCY_CHECK_NONE = 0;
public static final int DEPENDENCY_CHECK_OBJECTS = 1;
public static final int DEPENDENCY_CHECK_SIMPLE = 2;
public static final int DEPENDENCY_CHECK_ALL = 3;
private Object beanClass;
private boolean abstractFlag = false;
private boolean singleton = true;
private boolean lazyInit = false;
private ConstructorArgumentValues constructorArgumentValues;
private MutablePropertyValues propertyValues;
private MethodOverrides methodOverrides = new MethodOverrides();
private String initMethodName;
private String destroyMethodName;
private String factoryMethodName;
private String factoryBeanName;
private int autowireMode = AUTOWIRE_NO;
private int dependencyCheck = DEPENDENCY_CHECK_NONE;
private String[] dependsOn;
private String resourceDescription;
/**
* Create a new AbstractBeanDefinition with default settings.
*/
protected AbstractBeanDefinition() {
this(null, null);
}
/**
* Create a new AbstractBeanDefinition with the given
* constructor argument values and property values.
*/
protected AbstractBeanDefinition(ConstructorArgumentValues cargs, MutablePropertyValues pvs) {
setConstructorArgumentValues(cargs);
setPropertyValues(pvs);
}
/**
* Create a new AbstractBeanDefinition as deep copy of the given
* bean definition.
* @param original the original bean definition to copy from
*/
protected AbstractBeanDefinition(AbstractBeanDefinition original) {
this.beanClass = original.beanClass;
setAbstract(original.isAbstract());
setSingleton(original.isSingleton());
setLazyInit(original.isLazyInit());
setConstructorArgumentValues(new ConstructorArgumentValues(original.getConstructorArgumentValues()));
setPropertyValues(new MutablePropertyValues(original.getPropertyValues()));
setMethodOverrides(new MethodOverrides(original.getMethodOverrides()));
setInitMethodName(original.getInitMethodName());
setDestroyMethodName(original.getDestroyMethodName());
setFactoryMethodName(original.getFactoryMethodName());
setFactoryBeanName(original.getFactoryBeanName());
setDependsOn(original.getDependsOn());
setAutowireMode(original.getAutowireMode());
setDependencyCheck(original.getDependencyCheck());
setResourceDescription(original.getResourceDescription());
}
/**
* Override settings in this bean definition from the given bean definition.
* <p><ul>
* <li>Will override beanClass if specified in the given bean definition.
* <li>Will always take abstract, singleton, lazyInit from the given bean definition.
* <li>Will add constructorArgumentValues, propertyValues, methodOverrides to
* existing ones.
* <li>Will override initMethodName, destroyMethodName, staticFactoryMethodName
* if specified.
* <li>Will always take dependsOn, autowireMode, dependencyCheck from the
* given bean definition.
* </ul>
*/
public void overrideFrom(AbstractBeanDefinition other) {
if (other.beanClass != null) {
this.beanClass = other.beanClass;
}
setAbstract(other.isAbstract());
setSingleton(other.isSingleton());
setLazyInit(other.isLazyInit());
getConstructorArgumentValues().addArgumentValues(other.getConstructorArgumentValues());
getPropertyValues().addPropertyValues(other.getPropertyValues());
getMethodOverrides().addOverrides(other.getMethodOverrides());
if (other.getInitMethodName() != null) {
setInitMethodName(other.getInitMethodName());
}
if (other.getDestroyMethodName() != null) {
setDestroyMethodName(other.getDestroyMethodName());
}
if (other.getFactoryMethodName() != null) {
setFactoryMethodName(other.getFactoryMethodName());
}
if (other.getFactoryBeanName() != null) {
setFactoryBeanName(other.getFactoryBeanName());
}
setDependsOn(other.getDependsOn());
setAutowireMode(other.getAutowireMode());
setDependencyCheck(other.getDependencyCheck());
setResourceDescription(other.getResourceDescription());
}
/**
* Return whether this definitions specifies a bean class.
*/
public boolean hasBeanClass() {
return (this.beanClass instanceof Class);
}
/**
* Specify the class for this bean.
*/
public void setBeanClass(Class beanClass) {
this.beanClass = beanClass;
}
/**
* Return the class of the wrapped bean.
* @throws IllegalStateException if the bean definition
* does not carry a resolved bean class
*/
public Class getBeanClass() throws IllegalStateException {
if (!(this.beanClass instanceof Class)) {
throw new IllegalStateException("Bean definition does not carry a resolved bean class");
}
return (Class) this.beanClass;
}
/**
* Specify the class name for this bean.
*/
public void setBeanClassName(String beanClassName) {
this.beanClass = beanClassName;
}
/**
* Return the class name of the wrapped bean.
*/
public String getBeanClassName() {
if (this.beanClass instanceof Class) {
return ((Class) this.beanClass).getName();
}
else {
return (String) this.beanClass;
}
}
/**
* Set if this bean is "abstract", i.e. not meant to be instantiated itself but
* rather just serving as parent for concrete child bean definitions.
* <p>Default is false. Specify true to tell the bean factory to not try to
* instantiate that particular bean in any case.
*/
public void setAbstract(boolean abstractFlag) {
this.abstractFlag = abstractFlag;
}
/**
* Return whether this bean is "abstract", i.e. not meant to be instantiated
* itself but rather just serving as parent for concrete child bean definitions.
*/
public boolean isAbstract() {
return abstractFlag;
}
/**
* Set if this a <b>Singleton</b>, with a single, shared instance returned
* on all calls. If false, the BeanFactory will apply the <b>Prototype</b>
* design pattern, with each caller requesting an instance getting an
* independent instance. How this is defined will depend on the BeanFactory.
* <p>"Singletons" are the commoner type, so the default is true.
*/
public void setSingleton(boolean singleton) {
this.singleton = singleton;
}
/**
* Return whether this a <b>Singleton</b>, with a single, shared instance
* returned on all calls.
*/
public boolean isSingleton() {
return singleton;
}
/**
* Set whether this bean should be lazily initialized.
* Only applicable to a singleton bean.
* If false, it will get instantiated on startup by bean factories
* that perform eager initialization of singletons.
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -