abstractbeanfactory.java
来自「一个关于Spring框架的示例应用程序,简单使用,可以参考.」· Java 代码 · 共 1,016 行 · 第 1/3 页
JAVA
1,016 行
return this.parentBeanFactory.getType(name);
}
throw ex;
}
catch (BeanCreationException ex) {
// Can only happen when checking FactoryBean.
logger.debug("Ignoring BeanCreationException on FactoryBean type check", ex);
return null;
}
}
public String[] getAliases(String name) throws NoSuchBeanDefinitionException {
String beanName = transformedBeanName(name);
// Check if bean actually exists in this bean factory.
if (this.singletonCache.containsKey(beanName) || containsBeanDefinition(beanName)) {
// If found, gather aliases.
List aliases = new ArrayList();
synchronized (this.aliasMap) {
for (Iterator it = this.aliasMap.entrySet().iterator(); it.hasNext();) {
Map.Entry entry = (Map.Entry) it.next();
if (entry.getValue().equals(beanName)) {
aliases.add(entry.getKey());
}
}
}
return (String[]) aliases.toArray(new String[aliases.size()]);
}
else {
// Not found -> check parent.
if (this.parentBeanFactory != null) {
return this.parentBeanFactory.getAliases(name);
}
throw new NoSuchBeanDefinitionException(beanName, toString());
}
}
//---------------------------------------------------------------------
// Implementation of HierarchicalBeanFactory interface
//---------------------------------------------------------------------
public BeanFactory getParentBeanFactory() {
return parentBeanFactory;
}
//---------------------------------------------------------------------
// Implementation of ConfigurableBeanFactory interface
//---------------------------------------------------------------------
public void setParentBeanFactory(BeanFactory parentBeanFactory) {
this.parentBeanFactory = parentBeanFactory;
}
public void registerCustomEditor(Class requiredType, PropertyEditor propertyEditor) {
Assert.notNull(requiredType, "Required type must not be null");
Assert.notNull(propertyEditor, "PropertyEditor must not be null");
this.customEditors.put(requiredType, propertyEditor);
}
/**
* Return the map of custom editors, with Classes as keys
* and PropertyEditors as values.
*/
public Map getCustomEditors() {
return customEditors;
}
public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) {
Assert.notNull(beanPostProcessor, "BeanPostProcessor must not be null");
this.beanPostProcessors.add(beanPostProcessor);
if (beanPostProcessor instanceof DestructionAwareBeanPostProcessor) {
this.hasDestructionAwareBeanPostProcessors = true;
}
}
/**
* Return the list of BeanPostProcessors that will get applied
* to beans created with this factory.
*/
public List getBeanPostProcessors() {
return beanPostProcessors;
}
/**
* Return whether this factory holds a DestructionAwareBeanPostProcessor
* that will get applied to singleton beans on shutdown.
* @see #addBeanPostProcessor
* @see org.springframework.beans.factory.config.DestructionAwareBeanPostProcessor
*/
protected boolean hasDestructionAwareBeanPostProcessors() {
return this.hasDestructionAwareBeanPostProcessors;
}
/**
* Create a new BeanWrapper for the given bean instance.
* <p>Default implementation creates a BeanWrapperImpl.
* Can be overridden for custom BeanWrapper adaptations.
* @param beanInstance the bean instance to create the BeanWrapper for,
* or null for a BeanWrapper that does not yet contain a target object
* @return the BeanWrapper
*/
protected BeanWrapper createBeanWrapper(Object beanInstance) {
return (beanInstance != null ? new BeanWrapperImpl(beanInstance) : new BeanWrapperImpl());
}
/**
* Initialize the given BeanWrapper with the custom editors registered
* with this factory. To be called for BeanWrappers that will create
* and populate bean instances.
* @param bw the BeanWrapper to initialize
*/
protected void initBeanWrapper(BeanWrapper bw) {
for (Iterator it = this.customEditors.keySet().iterator(); it.hasNext();) {
Class clazz = (Class) it.next();
bw.registerCustomEditor(clazz, (PropertyEditor) this.customEditors.get(clazz));
}
}
public void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException {
Assert.hasText(beanName, "Bean name must not be empty");
Assert.hasText(alias, "Alias must not be empty");
if (logger.isDebugEnabled()) {
logger.debug("Registering alias '" + alias + "' for bean with name '" + beanName + "'");
}
synchronized (this.aliasMap) {
Object registeredName = this.aliasMap.get(alias);
if (registeredName != null) {
throw new BeanDefinitionStoreException("Cannot register alias '" + alias + "' for bean name '" +
beanName + "': it's already registered for bean name '" + registeredName + "'");
}
this.aliasMap.put(alias, beanName);
}
}
public void registerSingleton(String beanName, Object singletonObject) throws BeanDefinitionStoreException {
Assert.hasText(beanName, "Bean name must not be empty");
Assert.notNull(singletonObject, "Singleton object must not be null");
synchronized (this.singletonCache) {
Object oldObject = this.singletonCache.get(beanName);
if (oldObject != null) {
throw new BeanDefinitionStoreException("Could not register object [" + singletonObject +
"] under bean name '" + beanName + "': there's already object [" + oldObject + " bound");
}
addSingleton(beanName, singletonObject);
}
}
/**
* Add the given singleton object to the singleton cache of this factory.
* <p>To be called for eager registration of singletons, e.g. to be able to
* resolve circular references.
* @param beanName the name of the bean
* @param singletonObject the singleton object
*/
protected void addSingleton(String beanName, Object singletonObject) {
Assert.hasText(beanName, "Bean name must not be empty");
Assert.notNull(singletonObject, "Singleton object must not be null");
this.singletonCache.put(beanName, singletonObject);
}
/**
* Remove the bean with the given name from the singleton cache of this factory.
* <p>To be able to clean up eager registration of a singleton if creation failed.
* @param beanName the name of the bean
*/
protected void removeSingleton(String beanName) {
Assert.hasText(beanName, "Bean name must not be empty");
this.singletonCache.remove(beanName);
this.disposableBeans.remove(beanName);
}
/**
* Return the number of beans in the singleton cache.
* <p>Does not consider any hierarchy this factory may participate in.
*/
public int getSingletonCount() {
return this.singletonCache.size();
}
/**
* Return the names of beans in the singleton cache.
* <p>Does not consider any hierarchy this factory may participate in.
*/
public String[] getSingletonNames() {
return (String[]) this.singletonCache.keySet().toArray(new String[this.singletonCache.size()]);
}
public boolean containsSingleton(String beanName) {
Assert.hasText(beanName, "Bean name must not be empty");
return this.singletonCache.containsKey(beanName);
}
public void destroySingletons() {
if (logger.isInfoEnabled()) {
logger.info("Destroying singletons in factory {" + this + "}");
}
this.singletonCache.clear();
synchronized (this.disposableBeans) {
for (Iterator it = new HashSet(this.disposableBeans.keySet()).iterator(); it.hasNext();) {
destroyDisposableBean((String) it.next());
}
}
}
//---------------------------------------------------------------------
// Implementation methods
//---------------------------------------------------------------------
/**
* Return whether the given name is a factory dereference
* (beginning with the factory dereference prefix).
* @see BeanFactory#FACTORY_BEAN_PREFIX
* @see org.springframework.beans.factory.BeanFactoryUtils#isFactoryDereference
*/
protected boolean isFactoryDereference(String name) {
return BeanFactoryUtils.isFactoryDereference(name);
}
/**
* Return the bean name, stripping out the factory dereference prefix if necessary,
* and resolving aliases to canonical names.
*/
protected String transformedBeanName(String name) {
String beanName = BeanFactoryUtils.transformedBeanName(name);
// handle aliasing
String canonicalName = (String) this.aliasMap.get(beanName);
return canonicalName != null ? canonicalName : beanName;
}
/**
* Return a RootBeanDefinition, even by traversing parent if the parameter is a
* child definition. Can ask the parent bean factory if not found in this instance.
* @param beanName the name of the bean definition
* @param includingAncestors whether to ask the parent bean factory if not found
* in this instance
* @return a merged RootBeanDefinition with overridden properties
*/
protected RootBeanDefinition getMergedBeanDefinition(String beanName, boolean includingAncestors)
throws BeansException {
try {
return getMergedBeanDefinition(beanName, getBeanDefinition(beanName));
}
catch (NoSuchBeanDefinitionException ex) {
if (includingAncestors && getParentBeanFactory() instanceof AbstractBeanFactory) {
return ((AbstractBeanFactory) getParentBeanFactory()).getMergedBeanDefinition(beanName, true);
}
else {
throw ex;
}
}
}
/**
* Return a RootBeanDefinition for the given bean name, by merging with the
* parent if the given original bean definition is a child bean definition.
* @param beanName the name of the bean definition
* @param bd the original bean definition (Root/ChildBeanDefinition)
* @return a merged RootBeanDefinition with overridden properties
*/
protected RootBeanDefinition getMergedBeanDefinition(String beanName, BeanDefinition bd)
throws BeansException {
if (bd instanceof RootBeanDefinition) {
return (RootBeanDefinition) bd;
}
else if (bd instanceof ChildBeanDefinition) {
ChildBeanDefinition cbd = (ChildBeanDefinition) bd;
RootBeanDefinition pbd = null;
if (!beanName.equals(cbd.getParentName())) {
pbd = getMergedBeanDefinition(cbd.getParentName(), true);
}
else {
if (getParentBeanFactory() instanceof AbstractBeanFactory) {
AbstractBeanFactory parentFactory = (AbstractBeanFactory) getParentBeanFactory();
pbd = parentFactory.getMergedBeanDefinition(cbd.getParentName(), true);
}
else {
throw new NoSuchBeanDefinitionException(cbd.getParentName(),
"Parent name '" + cbd.getParentName() + "' is equal to bean name '" + beanName +
"' - cannot be resolved without an AbstractBeanFactory parent");
}
}
// deep copy with overridden values
RootBeanDefinition rbd = new RootBeanDefinition(pbd);
rbd.overrideFrom(cbd);
return rbd;
}
else {
throw new BeanDefinitionStoreException(bd.getResourceDescription(), beanName,
"Definition is neither a RootBeanDefinition nor a ChildBeanDefinition");
}
}
/**
* Check the given merged bean definition,
* potentially throwing validation exceptions.
* @param mergedBeanDefinition the bean definition to check
* @param beanName the name of the bean
* @param requiredType the required type of the bean
* @param args the arguments for bean creation, if any
* @throws BeansException in case of validation failure
*/
protected void checkMergedBeanDefinition(
RootBeanDefinition mergedBeanDefinition, String beanName, Class requiredType, Object[] args)
throws BeansException {
// check if bean definition is not abstract
if (mergedBeanDefinition.isAbstract()) {
throw new BeanIsAbstractException(beanName);
}
// Check if required type can match according to the bean definition.
// This is only possible at this early stage for conventional beans!
if (mergedBeanDefinition.hasBeanClass()) {
Class beanClass = mergedBeanDefinition.getBeanClass();
if (requiredType != null && mergedBeanDefinition.getFactoryMethodName() == null &&
!FactoryBean.class.isAssignableFrom(beanClass) && !requiredType.isAssignableFrom(beanClass)) {
throw new BeanNotOfRequiredTypeException(beanName, requiredType, beanClass);
}
}
// Check validity of the usage of the args parameter. This can
// only be used for prototypes constructed via a factory method.
if (args != null) {
if (mergedBeanDefinition.isSingleton()) {
throw new BeanDefinitionStoreException(
"Cannot specify arguments in the getBean() method when referring to a singleton bean definition");
}
else if (mergedBeanDefinition.getFactoryMethodName() == null) {
throw new BeanDefinitionStoreException(
"Can only specify arguments in the getBean() method in conjunction with a factory method");
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?