[6]-AOP动态代理

来源:互联网 发布:网络红歌2010 编辑:程序博客网 时间:2024/04/27 17:25

AOP术语

  • 连接点:被我们拦截到的那个方法
  • 切面的切点:指定希望在程序流中拦截的连接点
  • 切面的通知类型
    • 1)前置:在连接点之前
    • 2)后置:在连接点正常完成之后
    • 3)异常:在方法抛出异常退出时
    • 4)最终:2)后置 + 3)异常
    • 5)环绕:可改变参数和返回结果,容易忘记执行原始的方法,invocation.proceed()

使用AOP:基于注解

  • 1)定义切面:MarinlogService接口,是一个注解
  • MarinlogUser类,使用@Aspect修饰
    • 切入点和切入类型
  • 连接点:
    • MarinlogUser类中

代理

public static void main(String[] args){    RealPerson xiaoMing=new RealPerson();    ProxyPerson  proxy=new ProxyPerson(xiaoMing);        proxy.sentGigt(1);}public interface abstractPerson {    public void sentGigt(int toPersonId);}public class RealPerson implements abstractPerson{    @Override    public void sentGigt(int toPersonId){        Print.print(" 被代理的类");          }}public class ProxyPerson implements abstractPerson{    public RealPerson real;    public ProxyPerson(RealPerson real){        this.real=real;    }    @Override    public void sentGigt(int toPersonId){        real.sentGigt(toPersonId);    }}
  • 静态代理:与反射无关,运行前,代理类的class 文件已生成,编译期间进行静态织入
  • 动态代理:反射生成代理类的字节码
    • 定义proxyHandler,实现InvocationHandler接口,持有被代理接口的引用,重写invoke()
    • Proxy.newProxyInstance(加载器,接口列表,proxyHandler)生成代理类对象,
    • 继承了Proxy类,实现了被代理者的所有接口,final
  • cglib(代理类)
    • 若被代理者没有实现任何接口,创建cglib代理,使用ASM(java字节码处理框架)
    • 可强制 < aop:aspectj-autoproxy proxy-target-class=”true”/>

AOP介绍

  • AOP是对OOP思想的补充和完善,OOP引进”抽象-封装-继承-多态”等概念,进行由上到下的抽象和层次封装

    • 但是具体细粒度到每个事物内部的情况,OOP就显得无能为力了,比如日志功能。
    • 日志代码往往水平地散布在所有对象层次当中,与它所散布到的对象的核心功能无关。
    • 导致了大量代码的重复,不利于各个模块的重用
  • 横切技术

    • 剖解开封装的对象内部,将公共行为封装成一个独立的模块(切面)
    • 又能将剖开的切面复原,融入核心业务逻辑中。这样,能便于之后横切功能的编辑和重用

0 0