这次的博客将会介绍两种动态代理的方式,一种为jdk动态代理,一种为cglib动态代理,在代码方面将会使用最少的代码来完成,类会尽量的少,帮助大家理解。
先讲一下这两种代理方式的主要区别,jdk动态代理要求代理的类必须要有实现的接口,而cglib是通过创建子类进行代理,不需要实现接口,具体操作马上介绍。
首先创建一个接口、一个类实现接口:
public interface Action { void action(); } public class Person implements Action{ @Override public void action() { System.out.println("切面"); } }
下面创建一个处理器类,实现jdk的InvocationHandler接口,这个处理器类用来对代理对象进行处理:
public class PersonInvocationHandler implements InvocationHandler{ private Person p; public PersonInvocationHandler (Person p){ this.p = p; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("前置事件"); method.invoke(p, args); System.out.println("后置事件"); return null; } }
在这个类中的参数介绍:
private Person p:需要进行Aop的对象,你可以改为任何想要的形式,比如private Object obj;或者你自己现在
创建一个类,然后写入。
Object proxy:基本不会用到,是jdk动态代理生成的对象,之后马上介绍,可以忽略。
Method method:jdk动态代理生成的代理对象所调用的方法。
Object args[]:上面method的参数。
这样看起来,我们的对象和PersonInvocationHandler还完全没有联系起来,接下来,我们将两者进行关联,创建一个Test测试类,内部只有一个main方法:
public class Test { public static void main(String[] args) { Person p = new Person(); InvocationHandler h = new PersonInvocationHandler(p); Action proxy = (Action) Proxy.newProxyInstance(p.getClass().getClassLoader(), p.getClass().getInterfaces(), h); proxy.action(); } }
首先创建一个Person类的对象p,我们要对p的action方法进行Aop,那么便需要与之前的PersonInvocationHandler联系起来,我们在创建PersonInvocationHandler的时候指定了构造函数,那么按照构造函数创建一个对象h,此h对象便是处理器。
接着创建一个代理对象,该对象通过java.lang.reflect.Proxy类的newProxyInstance方法创建,参数三个,分别为:
ClassLoader:类加载器,使用p.getClass().getClassLoader()即可。
Class<?>[]:jdk创建的代理对象需要实现的接口,数组形式。
InvocationHandler:处理器,创建的代理对象的任何方法都会经过该处理器,aop的关键
我们通过Proxy.newProxyInstance方法创建的proxy对象在执行方法时,全部会通过PersonInvocationHandler中的invoke方法,在上面没有介绍的invoke方法中的Object proxy参数即为此处创建的proxy对象。
这样一来我们就实现了一个简单的动态代理,如果你要处理更复杂业务,只需要添加相应的业务代码到InvocationHandler中的invoke方法中便能实现。
虽然jdk动态代理已经很好用了,但我们有时候没有实现接口该怎么办呢,此时就需要请出cglib动态代理了。
cglib动态代理不再是创建实现了指定借口的对象了,而是创建继承了指定类的对象:
public class Test { public static void main(String[] args) { Enhancer en = new Enhancer(); en.setSuperclass(Person.class); en.setCallback( new CGlibProxy() ); Person p = (Person) en.create(); p.action(); } }Enhancer翻译过来即为增强器,相当于jdk动态代理中的Proxy类,同样是用于创建代理对象,
setSuperclass(Class<?> clazz)用于指定需要继承的类。
setCallback(Callback callback)用于指定处理器。
在cglib中也有处理器,不过名字却叫做拦截器了,如下所示,实现了MethodInterceptor接口:
public class CGlibProxy implements MethodInterceptor { @Override public Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { System.out.println("前置事件"); Object result = methodProxy.invokeSuper(object, args); System.out.println("后置事件"); return result; } }内部有一个需要实现的方法intercept
相关推荐
Java动态代理是Java编程中一个重要的特性,它允许在运行时创建代理对象,这些代理对象可以作为原有对象的代理,实现在调用原有方法前后添加额外的功能,这正是AOP(面向切面编程)的核心思想。下面我们将深入探讨...
在Java中实现AOP可以通过动态代理模式,其中Java动态代理是一个非常重要的实现方式。 Java动态代理机制要求被代理的类必须实现至少一个接口,因为Java动态代理是通过JDK的java.lang.reflect.Proxy类和java.lang....
Spring框架是Java中实现AOP的一个流行工具,它通过动态代理机制实现了这一功能。本文将深入探讨Spring AOP的实现原理,以及如何使用反射来实现动态代理模式。 首先,我们需要了解AOP的基本概念。AOP的核心思想是切...
本话题主要围绕"Java分页"、"动态代理"以及"AOP(面向切面编程)"在Spring框架中的实现进行详细讲解。 首先,我们来看"Java分页"。在处理大量数据时,一次性加载所有数据不仅会消耗大量的内存,也可能导致用户界面...
下面将详细阐述Java动态代理以及如何用它来实现AOP中的日志记录。 1. Java动态代理简介: Java中的动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类用于...
以下是如何使用Java动态代理实现AOP的一个简单示例: 首先,我们需要定义一个业务接口,例如`BusinessInterface`,该接口包含我们的核心业务逻辑方法,如`processBusiness()`。 ```java public interface ...
Java 动态代理技术是Java平台提供的一种强大的编程机制,它允许我们在运行时创建具有特定接口的代理对象,这些代理对象可以对方法调用进行拦截和处理,这正是AOP(面向切面编程)的核心思想。在Java中,动态代理主要...
在Spring中,AOP主要通过两种动态代理技术实现:JDK动态代理和CGLIB动态代理。 首先,让我们详细了解一下JDK动态代理。JDK动态代理基于Java的接口实现,它适用于目标对象实现了至少一个接口的情况。在运行时,JDK...
- `设计模式:用Java动态代理实现AOP.docx`可能包含了如何使用Java动态代理来实现设计模式,尤其是代理模式,以达到AOP的效果。 - `Spring AOP入门实例详解.docx`可能涵盖了Spring AOP的基本概念、配置以及如何...
以下是一个简单的Java动态代理示例: ```java public class MyInvocationHandler implements InvocationHandler { private Object target; public MyInvocationHandler(Object target) { this.target = target;...
在提供的源码文件中,可能包含了示例代码,如自定义的`InvocationHandler`实现、切点定义、通知配置等,你可以通过这些例子深入理解动态代理和Spring AOP的工作原理。 总结起来,动态代理和Spring AOP是Java和...
Spring AOP(面向切面编程)是Spring框架的一部分,它利用了动态代理来实现切面的功能,如日志、事务管理、性能监控等。现在,让我们深入探讨Java动态代理及其在Spring AOP中的应用。 首先,我们需要了解Java动态...
Java AOP(面向切面编程)是一种编程范式,它允许程序员定义“切面”,这些切面封装了特定关注点的代码,如日志、事务管理、权限检查等...文件列表中的"java实现aop案例"可能是示例代码或相关资源,供读者下载和实践。