• 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生产动态代理类
    

  • 相关阅读:
    如何成为一名数据科学家
    暑假反思
    暑假计划(7月23日-8月21日)
    ACM数论模板
    Nelder–Mead method
    Introduction to Data Mining
    51_1037最长循环节 (miller rabin算法 pollard rho算法 原根)
    乘法逆元(转)
    51_1228 序列求和(伯努利数)(转)
    清除input中内容的简单方法
  • 原文地址:https://www.cnblogs.com/Qkxh320/p/spring_0000000003.html
Copyright © 2020-2023  润新知