在前面的源码分析中我们了解到,依赖注入(DI)的入口是getBean()方法,而前面IoC手写部分的基本流程有已完成。先在GPApplicationContext中定义IoC容器,然后将GPBeanWrapper对象保存到Map中。在GPApplicationContext中设计两个Map:factoryBeanObjectCache保存单例对象的缓存,factoryBeanInstanceCache保存GPBeanWrapper的缓存。变量名也和原生Spring保持一致。这两个对象的设计其实就是注册单例模式的经典应用。publicclassGPApplicationContextendsGPDefaultListableBeanFactoryimplementsGPBeanFactory{privateString[]configLocations;privateGPBeanDefinitionReaderreader;//用来保证注册单例的容器privateMapfactoryBeanObjectCache=newHashMap();//用来存放所有被代理的对象factoryBeanInstanceCache=newConcurrentHashMap();...}1从getBean()方法开始,我们从改进getBean()方法开始:@OverridepublicObjectgetBean(StringbeanName){GPBeanDefinitionbeanDefinition=super.beanDefinitionMap.get(beanName);try{//生成通知事件GPBeanPostProcessorbeanPostProcessor=newGPBeanPostProcessor();Objectinstance=instantiateBean(beanDefinition);if(null==instance){returnnull;}//实例初始化前调用beanPostProcessor.postProcessBeforeInitialization(instance,beanName);GPBeanWrapperbeanWrapper=newGPBeanWrapper(实例);this.factoryBeanInstanceCache.put(beanName,beanWrapper);//调用beanPostProcessor.postProcessAfterInitialization(instance,beanName);populateBean(beanName,instance);//这样调用,相当于给我们留了一个可操作的空间returnthis.factoryBeanInstanceCache.get(beanName).getWrappedInstance();}catch(Exceptione){//e.printStackTrace();returnull;}}2instantiateBean()方法反射创建实例//传递一个BeanDefinition并返回一个实例BeanprivateObjectinstantiateBean(GPBeanDefinitionbeanDefinition){Objectinstance=null;StringclassName=beanDefinition.getBeanClassName();try{//因为根据Class可以判断一个类是否有实例clazz.newInstance();this.factoryBeanObjectCache.put(beanDefinition.getFactoryBeanName(),instance);}returninstance;}catch(Exceptione){e.printStackTrace();}returnnull;}3populateBean()方法完成依赖注入privatevoidpopulateBean(StringbeanName,对象实例){Classclazz=instance.getClass();if(!(clazz.isAnnotationPresent(GPController.class)||clazz.isAnnotationPresent(GPService.class))){return;}Fieldd[]fields=clazz.getDeclaredFields();for(Fieldfield:fields){if(!field.isAnnotationPresent(GPAutowired.class)){continue;}GPAutowiredautowired=field.getAnnotation(GPAutowired.class);StringautowiredBeanName=autowired.value().trim();if("".equals(autowiredBeanName)){autowiredBeanName=field.getType().getName();}field.setAccessible(true);try{field.set(实例,this.factoryBeanInstanceCache.get(autowiredBeanName).getWrappedInstance());}catch(IllegalAccessExceptione){//e.printStackTrace();}}}4GPBeanPostProcessor原生Spring中的后处理器BeanPostProcessor是为对象初始化事件设置的回调机制。这个在Mini版中只做了说明,没有具体实现。感兴趣的“小伙伴”可以继续深入研究Spring源码。packagecom.tom.spring.formework.beans.config;publicclassGPBeanPostProcessor{//提供Bean初始化前的回调入口publicObjectpostProcessBeforeInitialization(Objectbean,StringbeanName)throwsException{returnbean;}//提供Bean初始化后的回调入口publicObjectpostProcessAfterInitialization(Objectbean,StringbeanName)throwsException{returnbean;}}至此,DI部分已经手写完成,也就是说Spring的核心部分已经完成。“小伙伴们”有没有发现其实很简单呢?