一、静态代理
目的是调用接口实现类的某个方法之前或者之后调用另外的操作。
总结下开发步骤:
1、创建一个接口
2、创建一个接口的实现类
3、创建一个代理类,这个代理类也实现了上边的接口,但是将 要被代理的实现类传入到代理类中,在代理类的接口实现方法中调用,并在调用前后加上一些操作(日志等)
二、动态代理
AOP的原理就是动态代理。
JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。其中InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,在并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一起。而Proxy为InvocationHandler实现类动态创建一个符合某一接口的代理实例。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyHandler implements InvocationHandler {
private Object target;
public MyHandler(Object target){//①target为目标的业务类
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//横向逻辑代码
Object bj = method.invoke(target, args);//②通过反射方法调用目标业务类的业务方法
//横向逻辑代码
return obj;
}
}
</pre><p></p><h2>Proxy联系Handler与业务逻辑</h2><pre name="code" class="java"><pre name="code" class="java"> import java.lang.reflect.Proxy;
public class Service {
public static void main(String[] args) {
ForumService target = new ForumServiceImpl();//①目标业务类
//② 将目标业务类和横切代码编织到一起
PerformaceHandler handler = new PerformaceHandler(target);
//③为编织了目标业务类逻辑和性能监视横切逻辑的handler创建代理类
ForumService proxy = (ForumService) Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
handler);
//④ 操作代理实例
proxy.removeForum(10);
proxy.removeTopic(1012);
}
}
代理实例就实现了目标业务类的所有接口。我们就可以按照调用业务逻辑接口的实例相同的方式调用代理实例。
动态代理实现了业务逻辑代码和横向服务逻辑代码的分离。当其他的业务类需要调用相同的横向服务时,分别为它们创建代理对象就可以了。