spring学习----bean实例化

来源:互联网 发布:淘宝店如何装修 编辑:程序博客网 时间:2024/05/24 01:19

实例化相关核心类

  • AbstractBeanFactory 实现getBean
  • AbstractAutowireCapableBeanFactory 实现createBean(即实例化bean)

bean生命周期

  1. bean实例创建
  2. 为bean实例设置属性
  3. 调用bean的初始化方法
  4. 应用通过IOC容器使用bean
  5. 容器关闭时,调用销毁方法destory

bean实例化入口getBean()方法

AbstractBeanFactory实现getBean()–>doGetBean–>createBean()

子类AbstractAutowireCapableBeanFactory实现createBean–>doCreateBean

 1、createBeanInstance方法创建bean(JVM反射  cglib具体参考源码) 1、populateBean方法(依赖注入,先执行autowire注解,在执行property注入依赖) 2、initializeBean()初始化bean      第一步判断是否实现BeanNameAware、BeanClassLoaderAware、BeanFactoryAware接口执行相应set方法      第二步执行实现BeanPostProcessor接口的前置方法postProcessBeforeInitialization      第三步执行初始化方法           是否实现InitializingBean若实现先执行afterProperties方法           执行指定init方法      第四步执行实现BeanPostProcessor接口的后置方法postProcessAfterInitialization

注意:
getBean先从缓存了查找,有直接获取,没有创建已bean实例
doGetBean中判断是否有依赖,若有,先实例化依赖bean(getBean递归实现)

相应源码

依赖递归实现AbstractBeanFactory doGetBean

final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);checkMergedBeanDefinition(mbd, beanName, args);// Guarantee initialization of beans that the current bean depends on.String[] dependsOn = mbd.getDependsOn();if (dependsOn != null) {   for (String dep : dependsOn) {      if (isDependent(beanName, dep)) {         throw new BeanCreationException(mbd.getResourceDescription(), beanName,               "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");      }      registerDependentBean(dep, beanName);      getBean(dep);   }}

AbstractAutowireCapableBeanFactory实例化实现类 doCreateBean

protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)            throws BeanCreationException {        // Instantiate the bean.        BeanWrapper instanceWrapper = null;        if (mbd.isSingleton()) {            instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);        }        if (instanceWrapper == null) {            instanceWrapper = createBeanInstance(beanName, mbd, args);        }        final Object bean = (instanceWrapper != null ? instanceWrapper.getWrappedInstance() : null);        Class<?> beanType = (instanceWrapper != null ? instanceWrapper.getWrappedClass() : null);        mbd.resolvedTargetType = beanType;        // Allow post-processors to modify the merged bean definition.        synchronized (mbd.postProcessingLock) {            if (!mbd.postProcessed) {                try {                    applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);                }                catch (Throwable ex) {                    throw new BeanCreationException(mbd.getResourceDescription(), beanName,                            "Post-processing of merged bean definition failed", ex);                }                mbd.postProcessed = true;            }        }        // Eagerly cache singletons to be able to resolve circular references        // even when triggered by lifecycle interfaces like BeanFactoryAware.        boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&                isSingletonCurrentlyInCreation(beanName));        if (earlySingletonExposure) {            if (logger.isDebugEnabled()) {                logger.debug("Eagerly caching bean '" + beanName +                        "' to allow for resolving potential circular references");            }            addSingletonFactory(beanName, new ObjectFactory<Object>() {                @Override                public Object getObject() throws BeansException {                    return getEarlyBeanReference(beanName, mbd, bean);                }            });        }        // Initialize the bean instance.        Object exposedObject = bean;        try {            populateBean(beanName, mbd, instanceWrapper);            if (exposedObject != null) {                exposedObject = initializeBean(beanName, exposedObject, mbd);            }        }        ...
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 {      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;}
protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd)      throws Throwable {   boolean isInitializingBean = (bean instanceof InitializingBean);   if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {      if (logger.isDebugEnabled()) {         logger.debug("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");      }      if (System.getSecurityManager() != null) {         try {            AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {               @Override               public Object run() throws Exception {                  ((InitializingBean) bean).afterPropertiesSet();                  return null;               }            }, getAccessControlContext());         }         catch (PrivilegedActionException pae) {            throw pae.getException();         }      }      else {         ((InitializingBean) bean).afterPropertiesSet();      }   }   if (mbd != null) {      String initMethodName = mbd.getInitMethodName();      if (initMethodName != null && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&            !mbd.isExternallyManagedInitMethod(initMethodName)) {         invokeCustomInitMethod(beanName, bean, mbd);      }   }}

bean对容器感知

  • 通过实现aware接口 set方法 实际执行时机initializeBean方法
    BeanNameAware
    BeanClassLoaderAware
    BeanFactoryAware
    ResourceLoaderAware
    ApplicationContextAware
    MessageSourceAware
    ApplicationEventPublisherAware

  • ApplicationContextAwareProcessor (实现BeanPostProcessor接口)
    使bean能通过实现Aware接口set方法获取容器相关高级特性

 private void invokeAwareInterfaces(Object bean) {        if(bean instanceof Aware) {            if(bean instanceof EnvironmentAware) {                ((EnvironmentAware)bean).setEnvironment(this.applicationContext.getEnvironment());            }            if(bean instanceof EmbeddedValueResolverAware) {                ((EmbeddedValueResolverAware)bean).setEmbeddedValueResolver(this.embeddedValueResolver);            }            if(bean instanceof ResourceLoaderAware) {                ((ResourceLoaderAware)bean).setResourceLoader(this.applicationContext);            }            if(bean instanceof ApplicationEventPublisherAware) {                ((ApplicationEventPublisherAware)bean).setApplicationEventPublisher(this.applicationContext);            }            if(bean instanceof MessageSourceAware) {                ((MessageSourceAware)bean).setMessageSource(this.applicationContext);            }            if(bean instanceof ApplicationContextAware) {                ((ApplicationContextAware)bean).setApplicationContext(this.applicationContext);            }        }    }
原创粉丝点击