zoukankan      html  css  js  c++  java
  • 01 oveview & AOP 原理

    什么是 Spring?

    轻量, 一站式(每一个层次都提供了解决方案), 非入侵(不会改变你原来的代码逻辑)

    分层架构:

    web层: spring.MVC

    service层: spring

    dao层: mybatis

    Spring 核心: 控制反转(IoC) 和 切面编程(AOP)

    IoC: 由 spring 创建对象.

    AOP: 支持事务处理

    AOP 底层将采用代理的机制进行实现, 横向抽取,取代了传统的纵向继承, 经典应用: 事务管理. 日志。

    AOP 术语: 

    Target: 目标类, 需要被代理的类. 例如 UserService

    Joinpoint: 连接点, 指哪些可能会被拦截的方法. 例如: UserService 的所有方法.

    PointCut: 切入点, 已经被增强的连接点. 例如 addUser() 

    Advice: 通知/增强, 增强的代码, 比如 事务的 before() 和 after()

    Weaving(织入): 将 advice 应用到目标对象而形成代理.

    Proxy 代理类: 我们最后想要的结果。

    Aspect(切面), 切入点PointCut 和通知Advice 的结合. (却如点和Advice结合可以形成一条线,多个结合, 即多条线, 最后形成一个面, 虚构出来的面).

    手动生成代理:

     

    代理

    AOP 实际上就是利用的代理模式.

    静态代理

    角色分析:

    • 抽象角色:一般会使用接口或者抽象类来解决.(租房这件事/或者说这个操作)
    • 真实角色:被代理的角色.(房子主人)
    • 代理角色:代理真实角色,代理真实角色后,我们会做一些附属操作(中介, 除了租房之外, 中介还要收取中介费)
    • 客户:访问代理的人.(租房的人)

    缺点:一个真实角色会产生一个代理角色。

    AOP: 横向开发, 通过代理切入进去,而不改变原来程序。比如我们原来已经有了一个APP, 需要增加一个日志功能, 那么, 可以通过这种AOP机制增加日志功能而不修改之前的代码.

    我们想增加新的逻辑,比如增加日志功能,又不想增加代码量.(如上的缺点),AOP考虑动态代理

    动态代理:

    • 动态代理和静态代理角色一样
    • 动态代理是动态生成的,而不是我们直接写好的。(应该是拼接起来的)
    • 动态代理分为两大类:基于接口的动态代理,基于类的动态代理
      • 基于接口 -- JDK 动态代理
      •  基于类: cglib
      • java 字节码实现: javasist

    需要了解两个类 InvocationHandler, Proxy 类.  说白了, Proxy 帮我们自动创建了代理类,创建的方式就是通过拼接 真实角色和抽象角色的方式.

    实现 InvocationHandler 这个接口时,就会需要执行 invoke 方法(拼接)

    动态代理的本质就是通过反射代理类来生成代理类. 这里的方法 rent 是要修改的. 因为代理的目的不同,比如中介(代理)有婚介,有房产中介。

    现在的重点是, 我们没有代理类,而是通过这个来生成代理类,随着 rent 的变化,我们能生成不同的代理类, 婚介代理类,房产中介代理类.

    所以,我们需要把中介方法,比如收中介费写到上边这个类里。这是一个方法。

    下面代码是动态创建了 proxy 代理类. (全程没有创建代理类, 而是通过下边的方法生成的代理类)

     但是此时, 还没有把中介的方法加入其中, 所以我们需要定义好interface, 比如 收手续费等方法.

    应该把这些方法放到 ProxyInvocationHandler 中. 可以利用 Object 来做一个通用的创建代理类的方式:

     

     

    使用Spring 实现 AOP

    想增加的方法, 需要实现 MethodBeforeAdvice 这个接口.  可以看到这种接口已经写好了, before 和 after,也就是说已经定义好了再之前/之后执行.

    这些类需要注册到 Spring 中, 然后由 spring 帮我们生成代理类(想想spring的规则)

    Spring 优点

    Spring 是一个大工厂(容器),工厂是用来生产bean 的对象(代理类)。怎么感觉像是python 中的装饰器.(实际上也就是代理模式的精髓)

    SSM : SpringMVC + Spring + Mybatis

     

    spring maven 导包

    组成:7大模块

     

    Spring Boot

    快速开发的脚手架. 可以快速的开发单个微服务. 约定大于配置.

    Spring Cloud

    基于springBoot实现.

    学习SpringBoot 的前提,需要掌握Spring 和 SpringMVC.

    弊端:发展太久后,违背了原来的理念。配置十分繁琐(springboot真正解放了)

  • 相关阅读:
    [note]抽象类和接口的相同点和不同点
    百度竞价门再跟踪:违规医疗广告数量仍大幅增加
    获取拼音的第一个字母的方法
    一个分页存储过程
    正则表达式(Regular Expressions)
    四个故事
    Oracle 常用
    我很喜欢的一个[帖子]:从现在起,我开始还债。
    DataGrid 中的 HyperLinkColumn (可以携带多个Get参数)
    100 statements in English.
  • 原文地址:https://www.cnblogs.com/moveofgod/p/12331268.html
Copyright © 2011-2022 走看看