Spring AOP---切面编程基础(动态代理)

来源:互联网 发布:淘宝名字怎么改昵称 编辑:程序博客网 时间:2024/05/17 09:31


Spring AOP---切面编程基础(动态代理)


目标对象target:要被代理的对象

 

 

连接点:连接被代理对象中所有的方法.

 

 

切入点:被代理对象中指定要增强的方法

 

 

通知:通知对切入点做的具体操作叫做通知

 

 

切面:切入点+通知

 

 

织入:从被代理对象到代理对象的过程叫织入

 

 

代理:一个类被AOP增强后产生的对象


Spring aop底层实现的两种(jdk(必须实现接口的动态代理)cglib(即可实现接口,也可以不实现))

AOP分为静态AOP和动态AOP。静态AOP是指AspectJ实现的AOP,他是将切面代码直接编译到Java类文件中。动态AOP是指将切面代码进行动态织入实现的AOPSpringAOP为动态AOP,实现的技术为: JDK提供的动态代理技术  CGLIB(动态字节码增强技术


Jdk的动态代理

在运行时,通过jvm内部动态的通过类加载器来生成class字节码对象实现,jdk动态代理,只针对于接口操作.

 

//创始一个使用jdkproxy完成动态代理工具

publicclass JDKProxyFactory implements InvocationHandler {

 

       private Object target;

       public JDKProxyFactory(Object target) {

              this.target = target;

       }

       // 创建代理对象

       public Object createProxy() {

 

              // 使用Proxy完成代理对象创建

              // 1.得到目标对象的ClassLoader

              ClassLoader loader =target.getClass().getClassLoader();

              // 2.得到目标对象的实现接口的Class[]

              Class[] interfaces =target.getClass().getInterfaces();

              // 3.第三个参数需要一个实现了InvocationHandler接口的对象

              returnProxy.newProxyInstance(loader, interfaces, this);

       }

       // 在代理实例上处理方法调用并返回结果。

       // 参数1就是代理对象,一般不使用

       // 参数2它调用的方法的Method对象

       // 参数3调用的方法的参数

       @Override

       public Object invoke(Object proxy, Methodmethod, Object[] args) throws Throwable {

 

              // 功能增强操作

              System.out.println("日志操作....");

 

              return method.invoke(target,args);

       }

}


 

Cglib动态代理

个人觉得和proxy的方式类似

//1,创建enhance对象

Enhancer enhancer = newEnhancer();

//2,相当于是反射该类

enhancer.setSuperclass(target.getClass());

//设置回调函数,相当于InvocationHandler,中的inoke方法enhancer.setCallback(this);

 

实现了MethodInterceptor接口

使用其中的intercept方法返回一个方法





原创粉丝点击