spring 之 BeanNameAware

//BeanNameAware This interface is mainly used to obtain its own name in spring
public interface BeanNameAware extends Aware {

	void setBeanName(String name);

}

//The implementation principle is also injected when the bean is created
//AbstractAutowireCapableBeanFactory类下
protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {
		if (System.getSecurityManager() != null) {
			AccessController.doPrivileged(new PrivilegedAction<Object>() {
				@Override
				public Object run() {
					invokeAwareMethods(beanName, bean);
					return null;
				}
			}, getAccessControlContext());
		}
		else {   
		        //initialize here
			invokeAwareMethods(beanName, bean);
		}

		Object wrappedBean = bean;
		if (mbd == null || !mbd.isSynthetic()) {
			wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
		}

		try {
			invokeInitMethods(beanName, wrappedBean, mbd);
		}
		catch (Throwable ex) {
			throw new BeanCreationException(
					(mbd != null ? mbd.getResourceDescription() : null),
					beanName, "Invocation of init method failed", ex);
		}

		if (mbd == null || !mbd.isSynthetic()) {
		         
			wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
		}
		return wrappedBean;
	}


private void invokeAwareMethods(final String beanName, final Object bean) {
		if (bean instanceof Aware) {
		        //Inject beanName
			if (bean instanceof BeanNameAware) {
				((BeanNameAware) bean) .setBeanName (beanName);
			}
			//Inject the class loader that loads the bean
			if (bean instanceof BeanClassLoaderAware) {
				((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());
			}
			//Inject BeanFactory
			if (bean instanceof BeanFactoryAware) {
				((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
			}
		}
	}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=326444004&siteId=291194637