乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      spring XXXAWARE

       web127 2016-04-11

      spring中 有一大堆Aware結(jié)尾接口,  例如BeanFactoryAware,  ApplicationContextAware, ServletContextAware等

       在程序中 我們自定義的bean實現(xiàn)了 Aware相關(guān)接口  spring 通過回調(diào)   就可以獲得一些資源  

       比如說 我們的bean實現(xiàn)BeanFactoryAware  spring會在bean實例化(getBean)階段 回調(diào)該setBeanFactory方法   注入BeanFactory實例(也就是this)   

       spring   BeanFactoryAware 接口定義

      1. public interface BeanFactoryAware {  
      2.   
      3.    void setBeanFactory(BeanFactory beanFactory) throws BeansException;  
      4.   
      5. }  

       spring容器中的bean 實例化 是在AbstractBeanFactory getBean中發(fā)生

      1. public Object getBean(String name, Class requiredType, Object[] args) throws BeansException {  
      2.     return doGetBean(name, requiredType, args, false);  
      3. }  

      調(diào)用的 doGetBean 方法比較復雜  簡單看看 創(chuàng)建單例這段

      1. protected Object doGetBean(  
      2.             final String name, final Class requiredType, final Object[] args, boolean typeCheckOnly) throws BeansException {  
      3.   
      4.         final String beanName = transformedBeanName(name);  
      5.             .................略          // Create bean instance.  
      6.             //bean的定義是不是單例   
      7.             if (mbd.isSingleton()) {  
      8.                 sharedInstance = getSingleton(beanName, new ObjectFactory() {  
      9.                     public Object getObject() throws BeansException {  
      10.                         try {  
      11.                             // 是一個抽象方法  在子類AbstractAutowireCapableBeanFactory中實現(xiàn)  
      12.                             return createBean(beanName, mbd, args);  
      13.                         }  
      14.                         catch (BeansException ex) {  
      15.                             destroySingleton(beanName);  
      16.                             throw ex;  
      17.                         }  
      18.                     }  
      19.                 });  
      20.                 bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);  
      21.             }  
      22.   
      23.         .................略  
      24.         return bean;  
      25.     }  

      AbstractAutowireCapableBeanFactory  createBean方法

      1. protected Object createBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)  
      2.         throws BeanCreationException {  
      3.   
      4.     AccessControlContext acc = AccessController.getContext();  
      5.     return AccessController.doPrivileged(new PrivilegedAction() {  
      6.         public Object run() {  
      7.             .................略  
      8.             //關(guān)注doCreateBean方法  
      9.             Object beanInstance = doCreateBean(beanName, mbd, args);  
      10.             if (logger.isDebugEnabled()) {  
      11.                 logger.debug("Finished creating instance of bean '" + beanName + "'");  
      12.             }  
      13.             return beanInstance;  
      14.         }  
      15.     }, acc);  
      16. }  

      doCreateBean方法

      1. protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) {  
      2.         // Instantiate the bean.  
      3.         BeanWrapper instanceWrapper = null;  
      4.         if (mbd.isSingleton()) {  
      5.             instanceWrapper = (BeanWrapper) this.factoryBeanInstanceCache.remove(beanName);  
      6.         }  
      7.         .................略  
      8.         // Initialize the bean instance.  
      9.         Object exposedObject = bean;  
      10.         try {  
      11.             populateBean(beanName, mbd, instanceWrapper);  
      12.             //實現(xiàn) *Aware部分接口, InitializingBean接口  方法調(diào)用在此發(fā)生  
      13.             exposedObject = initializeBean(beanName, exposedObject, mbd);  
      14.         }  
      15.         catch (Throwable ex) {  
      16.             if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {  
      17.                 throw (BeanCreationException) ex;  
      18.             }  
      19.             else {  
      20.                 throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);  
      21.             }  
      22.         }  
      23.   
      24.         .................略  
      25.         return exposedObject;  
      26. }  

      initializeBean方法

      1. protected Object initializeBean(String beanName, Object bean, RootBeanDefinition mbd) {  
      2.     if (bean instanceof BeanNameAware) {  
      3.         ((BeanNameAware) bean).setBeanName(beanName);  
      4.     }  
      5.     if (bean instanceof BeanClassLoaderAware) {  
      6.         ((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());  
      7.     }  
      8.     // 如果當前bean 是BeanFactoryAware的一個實例   
      9.     if (bean instanceof BeanFactoryAware) {  
      10.         //回調(diào)當前實例注入資源  
      11.         ((BeanFactoryAware) bean).setBeanFactory(this);  
      12.     }  
      13.   
      14.     Object wrappedBean = bean;  
      15.     if (mbd == null || !mbd.isSynthetic()) {  
      16.         //BeanPostProcessor 接口  postProcessBeforeInitialization方法回調(diào)  
      17.         wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);  
      18.     }  
      19.     try {  
      20.         // 實現(xiàn)InitializingBean接口  afterPropertiesSet方法調(diào)用  
      21.         invokeInitMethods(beanName, wrappedBean, mbd);  
      22.     }  
      23.     catch (Throwable ex) {  
      24.         throw new BeanCreationException(  
      25.                 (mbd != null ? mbd.getResourceDescription() : null),  
      26.                 beanName, "Invocation of init method failed", ex);  
      27.     }  
      28.   
      29.     if (mbd == null || !mbd.isSynthetic()) {  
      30.         wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);  
      31.     }  
      32.     return wrappedBean;  
      33. }  


      Spring  aware相關(guān)接口


        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多