你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

Spring学习(三)——AOP

2021/11/26 17:25:56

一.动态代理

1.1 动态代理的原理

    代理设计模式的原理:使用一个代理将对象封装起来,然后用代理对象取代原始对象,任何对原始对象的调用都要通过代理,代理对象决定是否以及一何种方式将方法调用转到原始对象上。

1.2动态代理的方式

1.基于接口实现动态代理:JDK动态代理
2.基于继承实现动态代理:Cglib、javassist动态代理

1.JDK的动态代理
  (1) Proxy
    它是所有动态代理类的父类,专门用来生成代理类或者是代理对象。

//用来生成代理类的Class对象
public static Class<?> getProxyClass(ClassLoader loader,Class<?>... interfaces)
//用来生成代理对象
/**
  loader:ClassLoader对象,类加载器对象,帮我们加载动态生成的代理类;
  interfaces:接口们,提供目标对象的所有接口。
  h:InvocationHandler 对象
**/
 ClassLoader loader = target.getClass().getClassLoader();
 Class[] interfaces = target.getClass().getInterfaces();
public static Object newProxyInstance(ClassLoader loader,Class<?>... interfaces,InvocationHandler h)

  (2) InvocationHandler
    由它完成动态代理的整个过程

//invoke :代理对象调用代理方法,会回来调用invoke方法
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable;
//在该方法中包含Object result=method.invoke(target,args);该语句是目标对象执行目标方法

  动态代理需要明白:目标对象,如何获取代理对象以及代理要做什么。实际上,动态代理类是在运行时动态生成的,因此如果需要查看该动态代理类,需要将内存中的东西抓出来,只需在测试方法中加入如下代码来保存动态生成的代理类:

//将动态生成的代理类保存下来
Properties properties = System.getProperties();
properties.put("sun.misc.ProxyGenerator.saveGeneratedFiles","true");

  动态代理类中最重要的核心代码就是在某方法中执行如下语句:

super.h.invoke(this,m1,...);

二.AOP概述

  2.1 AOP
    AOP编程操作的主要对象是切面,而切面模块化横切关注点,横切关注点我们可以理解为功能,将这些功能抽取出来单独作为一个个的功能。在应用AOP编程时,仍然需要定义公共功能,但可以明确的定义这个功能应用在哪里,以什么方式应用,并且不必修改受影响的类,这样一来横切关注点就被模块化到特殊的类里——这样的类我们通常称为切面。比如验证功能、前置日志功能、后置日志功能等可以抽取出来成为验证切面、日志切面。
    AOP底层实际上就是动态代理。