spring中 有一大堆Aware结尾接口, 例如BeanFactoryAware, ApplicationContextAware, ServletContextAware等 在程序中 我们自定义的bean实现了 Aware相关接口 spring 通过回调 就可以获得一些资源 比如说 我们的bean实现BeanFactoryAware spring会在bean实例化(getBean)阶段 回调该setBeanFactory方法 注入BeanFactory实例(也就是this) spring BeanFactoryAware 接口定义 - public interface BeanFactoryAware {
-
- void setBeanFactory(BeanFactory beanFactory) throws BeansException;
-
- }
spring容器中的bean 实例化 是在AbstractBeanFactory getBean中发生 - public Object getBean(String name, Class requiredType, Object[] args) throws BeansException {
- return doGetBean(name, requiredType, args, false);
- }
调用的 doGetBean 方法比较复杂 简单看看 创建单例这段 - protected Object doGetBean(
- final String name, final Class requiredType, final Object[] args, boolean typeCheckOnly) throws BeansException {
-
- final String beanName = transformedBeanName(name);
- .................略
-
- if (mbd.isSingleton()) {
- sharedInstance = getSingleton(beanName, new ObjectFactory() {
- public Object getObject() throws BeansException {
- try {
-
- return createBean(beanName, mbd, args);
- }
- catch (BeansException ex) {
- destroySingleton(beanName);
- throw ex;
- }
- }
- });
- bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
- }
-
- .................略
- return bean;
- }
AbstractAutowireCapableBeanFactory createBean方法 - protected Object createBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)
- throws BeanCreationException {
-
- AccessControlContext acc = AccessController.getContext();
- return AccessController.doPrivileged(new PrivilegedAction() {
- public Object run() {
- .................略
-
- Object beanInstance = doCreateBean(beanName, mbd, args);
- if (logger.isDebugEnabled()) {
- logger.debug("Finished creating instance of bean '" + beanName + "'");
- }
- return beanInstance;
- }
- }, acc);
- }
doCreateBean方法 - protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) {
-
- BeanWrapper instanceWrapper = null;
- if (mbd.isSingleton()) {
- instanceWrapper = (BeanWrapper) this.factoryBeanInstanceCache.remove(beanName);
- }
- .................略
-
- Object exposedObject = bean;
- try {
- populateBean(beanName, mbd, instanceWrapper);
-
- exposedObject = initializeBean(beanName, exposedObject, mbd);
- }
- catch (Throwable ex) {
- if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {
- throw (BeanCreationException) ex;
- }
- else {
- throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);
- }
- }
-
- .................略
- return exposedObject;
- }
initializeBean方法 - protected Object initializeBean(String beanName, Object bean, RootBeanDefinition mbd) {
- if (bean instanceof BeanNameAware) {
- ((BeanNameAware) bean).setBeanName(beanName);
- }
- if (bean instanceof BeanClassLoaderAware) {
- ((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());
- }
-
- if (bean instanceof BeanFactoryAware) {
-
- ((BeanFactoryAware) bean).setBeanFactory(this);
- }
-
- 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;
- }
Spring aware相关接口

|