Spring三、30个类手写实现Spring IOC、DI、MVC、AOP

 在上次几百行代码简单实现了Spring的主要功能后,这次结合设计原则如单一职责、设计模式如适配器、工厂模式等,将这几百行代码分拆到不同的业务模块类中,并在每个实现类中将功能加以完善。

IOC、DI实现原理

 IOC、DI核心组件执行流程
 在Servlet的init()方法中初始化IOC容器和SpringMVC依赖的几大组件

  1. 容器启动,执行DispatcherServlet的init方法
  2. 创建bean工厂ApplicationContext
  3. 在ApplicationContext中创建Bean解析器BeanDefinitionReader
  4. 解析器BeanDefinitionReader将class解析为BeanDefinition
  5. 在ApplicationContext中维护BeanName与BeanDefinition关系,并将BeanDefiniton反射创建对象封装为BeanWrapper放入IOC容器
  6. 调用ApplicationContext的getBean(beanName)方法,为BeanWrapper进行属性的依赖注入

MVC实现原理

 MVC核心组件执行流程
 在Servlet的init()方法中初始化SpringMVC依赖的几大组件

   1. 容器启动,执行DispatcherServlet的init方法,创建IOC容器及进行依赖注入后
   2. 初始化Controller中RequestMapping的url与对象method的映射关系:HandlerMapping
   3. 初始化method的参数适配器: HandlerAdapter
   4. 初始化视图解析器: ViewResolver
   5. 页面发出请求,doDispatcher()分发url,匹配到对应HandlerMapping映射
   6. 在与参数适配器HandlerAdapter匹配,适配器根据请求Request中参数传入的值,为方法参数值赋值,method.invoke()反射执行获取反方法返回结果
   7. 执行结果如果为ModelAndView类型,交由视图解析器ViewResolver处理
   8. ViewResolver匹配ModelAndView值对应的模板引擎View、jsp、html资源,解析资源将占位符替换为Controller返回的具体参数
   9. 模板引擎View将解析结果通过Response返回

AOP实现原理

  在DI之前,Spring会根据定义的切面生成新的动态代理类

  1. ApplicationContext.getBean(beanName)中进行对象实例化
  2. 在初始化实例对象后,加载xml中配置的切面正则、切面类、前置后置通知、异常通知等至AopConfig
  3. 然后AdvisedSupport内,根据切面正则表达式匹配当前bean Class是否符合正则匹配
  4. class匹配通过、再反射获取class内所有method集合,判断每个method是否符合切面方法正则表达式,符合的话封装为Advice通知,并建立method与Advice映射关系
  5. 最后将AdvisedSupport传入JdkDynamicAopProxy代理类中,在invoke方法内放入前置后置通知、异常通知等,通过字节码重组生产新的代理类
  tips: 有接口实现的话使用JDK Proxy,否则使用Cglib生产动态代理类

posted @ 2020-02-23 16:55  BigShen  阅读(335)  评论(0编辑  收藏  举报