成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

30個類手寫Spring核心原理之依賴注入功能

開發 前端
在GPApplicationContext中設計兩個Map:factoryBeanObjectCache保存單例對象的緩存,factoryBeanInstanceCache保存GPBeanWrapper的緩存,變量命名也和原生Spring一致,這兩個對象的設計其實就是注冊式單例模式的經典應用。

[[440478]]

在之前的源碼分析中我們已經了解到,依賴注入(DI)的入口是getBean()方法,前面的IoC手寫部分基本流程已通。先在GPApplicationContext中定義好IoC容器,然后將GPBeanWrapper對象保存到Map中。在GPApplicationContext中設計兩個Map:factoryBeanObjectCache保存單例對象的緩存,factoryBeanInstanceCache保存GPBeanWrapper的緩存,變量命名也和原生Spring一致,這兩個對象的設計其實就是注冊式單例模式的經典應用。

  1. public class GPApplicationContext extends GPDefaultListableBeanFactory implements GPBeanFactory { 
  2.  
  3.     private String [] configLocations; 
  4.  
  5.     private GPBeanDefinitionReader reader; 
  6.  
  7.     //用來保證注冊式單例的容器 
  8.     private Map<String,Object> factoryBeanObjectCache = new HashMap<String, Object>(); 
  9.  
  10.     //用來存儲所有的被代理過的對象 
  11.     private Map<String,GPBeanWrapper> factoryBeanInstanceCache = new ConcurrentHashMap<String, GPBeanWrapper>(); 
  12.  
  13.     ... 
  14.  

1 從getBean()方法開始

下面我們從完善getBean()方法開始:

  1.     @Override 
  2.     public Object getBean(String beanName) { 
  3.  
  4.         GPBeanDefinition beanDefinition = super.beanDefinitionMap.get(beanName); 
  5.  
  6.         try{ 
  7.  
  8.             //生成通知事件 
  9.             GPBeanPostProcessor beanPostProcessor = new GPBeanPostProcessor(); 
  10.  
  11.             Object instance = instantiateBean(beanDefinition); 
  12.             if(null == instance){ return  null;} 
  13.  
  14.             //在實例初始化以前調用一次 
  15.             beanPostProcessor.postProcessBeforeInitialization(instance,beanName); 
  16.  
  17.             GPBeanWrapper beanWrapper = new GPBeanWrapper(instance); 
  18.  
  19.             this.factoryBeanInstanceCache.put(beanName,beanWrapper); 
  20.  
  21.             //在實例初始化以后調用一次 
  22.             beanPostProcessor.postProcessAfterInitialization(instance,beanName); 
  23.  
  24.             populateBean(beanName,instance); 
  25.  
  26.             //通過這樣調用,相當于給我們自己留有了可操作的空間 
  27.             return this.factoryBeanInstanceCache.get(beanName).getWrappedInstance(); 
  28.         }catch (Exception e){ 
  29. //            e.printStackTrace(); 
  30.             return null
  31.         } 
  32.     } 

2 instantiateBean()方法反射創建實例

  1. //傳一個BeanDefinition,就返回一個實例Bean 
  2. private Object instantiateBean(GPBeanDefinition beanDefinition){ 
  3.     Object instance = null
  4.     String className = beanDefinition.getBeanClassName(); 
  5.     try{ 
  6.  
  7.         //因為根據Class才能確定一個類是否有實例 
  8.         if(this.factoryBeanObjectCache.containsKey(className)){ 
  9.             instance = this.factoryBeanObjectCache.get(className); 
  10.         }else
  11.             Class<?> clazz = Class.forName(className); 
  12.             instance = clazz.newInstance(); 
  13.  
  14.             this.factoryBeanObjectCache.put(beanDefinition.getFactoryBeanName(),instance); 
  15.         } 
  16.  
  17.         return instance; 
  18.     }catch (Exception e){ 
  19.         e.printStackTrace(); 
  20.     } 
  21.  
  22.     return null

3 populateBean()方法完成依賴注入

  1.     private void populateBean(String beanName,Object instance){ 
  2.  
  3.         Class clazz = instance.getClass(); 
  4.  
  5.         if(!(clazz.isAnnotationPresent(GPController.class) || 
  6.                 clazz.isAnnotationPresent(GPService.class))){ 
  7.             return
  8.         } 
  9.  
  10.         Field [] fields = clazz.getDeclaredFields(); 
  11.  
  12.         for (Field field : fields) { 
  13.             if (!field.isAnnotationPresent(GPAutowired.class)){ continue; } 
  14.  
  15.             GPAutowired autowired = field.getAnnotation(GPAutowired.class); 
  16.  
  17.             String autowiredBeanName = autowired.value().trim(); 
  18.  
  19.             if("".equals(autowiredBeanName)){ 
  20.                 autowiredBeanName = field.getType().getName(); 
  21.             } 
  22.  
  23.             field.setAccessible(true); 
  24.  
  25.             try { 
  26.  
  27.                 field.set(instance,this.factoryBeanInstanceCache.get(autowiredBeanName). getWrappedInstance()); 
  28.  
  29.             } catch (IllegalAccessException e) { 
  30. //                e.printStackTrace(); 
  31.             } 
  32.  
  33.         } 
  34.  
  35.     } 

4 GPBeanPostProcessor后置處理器

原生Spring中的BeanPostProcessor是為對象初始化事件設置的一種回調機制。這個Mini版本中只做說明,不做具體實現,感興趣的“小伙伴”可以繼續深入研究Spring源碼。

  1. package com.tom.spring.formework.beans.config; 
  2.  
  3. public class GPBeanPostProcessor { 
  4.  
  5.     //為在Bean的初始化之前提供回調入口 
  6.     public Object postProcessBeforeInitialization(Object bean, String beanName) throws Exception { 
  7.         return bean; 
  8.     } 
  9.  
  10.     //為在Bean的初始化之后提供回調入口 
  11.     public Object postProcessAfterInitialization(Object bean, String beanName) throws Exception { 
  12.         return bean; 
  13.     } 

至此,DI部分就手寫完成了,也就是說完成了Spring的核心部分。“小伙伴們”是不是發現其實還是很簡單的?

 

責任編輯:姜華 來源: Tom彈架構
相關推薦

2021-12-27 08:27:17

SpringMVC面試

2021-12-14 07:43:52

Spring核心原理環境準備

2020-11-02 09:35:04

ReactHook

2020-12-03 08:14:45

Axios核心Promise

2011-05-31 10:00:21

Android Spring 依賴注入

2022-04-30 08:50:11

控制反轉Spring依賴注入

2021-07-29 06:55:03

Spring@AutowriedbyType注入

2022-01-05 08:53:13

Spring原理分析MVC

2023-02-23 08:15:33

Spring異常處理機制

2021-02-28 20:41:18

Vue注入Angular

2016-03-21 17:08:54

Java Spring注解區別

2020-05-21 13:25:43

Spring組件架構

2020-11-24 07:48:32

React

2021-08-10 18:36:02

Express原理面試

2020-10-20 09:12:57

axios核心原理

2020-08-06 00:14:16

Spring IoC依賴注入開發

2023-10-07 08:35:07

依賴注入Spring

2009-09-08 15:22:20

Spring依賴注入

2024-12-04 10:19:49

2011-03-01 13:45:41

Spring3Annotation
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕在线观看一区二区 | 免费成人在线网站 | 香蕉超碰 | 色眯眯视频在线观看 | 视频一区二区三区四区五区 | 精品欧美黑人一区二区三区 | 亚洲精品乱码久久久久久蜜桃91 | 91久久精品一区二区二区 | 男人的天堂久久 | 逼逼网| 成人国产精品久久 | 高清国产午夜精品久久久久久 | 国产精品自产拍 | 精品一区二区三区免费视频 | 一级黄色片在线免费观看 | 午夜在线| 伊人免费在线观看 | 欧区一欧区二欧区三免费 | 狠狠操在线 | 一级黄在线观看 | 一级毛片视频 | 一区二区三区四区在线视频 | 亚洲人成一区二区三区性色 | 日韩一区二区福利视频 | 不卡的av电影 | 91精品国产91久久久久久最新 | 国产伦精品一区二区三区四区视频 | 精品少妇一区二区三区在线播放 | 91精品国产91久久综合桃花 | 91精品国产综合久久婷婷香蕉 | 国产人成精品一区二区三 | 久久久国产一区二区三区 | 99视频在线 | 欧美一级片在线播放 | 亚洲高清免费 | 婷婷综合五月天 | jizz在线免费观看 | 久久精品二区 | av网站免费在线观看 | 欧美精品一区在线观看 | 青青草网 |