[b]一、用代理模式可以实现aop[/b]
1、目标对象和代理对象共同实现同一个接口,当用户调用接口时,返回代理类,代理类里先进行交叉业务逻辑,再进行目标对象的业务逻辑。
[img]/upload/attachment/86423/5f8e4a75-5de6-3570-8702-c516c8e37911.gif[/img]
2、使用JDK中的Proxy类,我们可以只需什么一个切面类,一个目标类,和一个接口,就可以动态得到一个代理类。
[align=center][i]目标对象,继承了接口ICustomerServiceProxy[/i][/align]
[align=center][i]切面[/i][/align]
1、目标对象和代理对象共同实现同一个接口,当用户调用接口时,返回代理类,代理类里先进行交叉业务逻辑,再进行目标对象的业务逻辑。
[img]/upload/attachment/86423/5f8e4a75-5de6-3570-8702-c516c8e37911.gif[/img]
2、使用JDK中的Proxy类,我们可以只需什么一个切面类,一个目标类,和一个接口,就可以动态得到一个代理类。
public class CustomerServiceImpl implements ICustomerServiceProxy {
public void register() {
System.out.println("注册!");
}
}
[align=center][i]目标对象,继承了接口ICustomerServiceProxy[/i][/align]
/**
* 切面
*
* @author dsm
*
*/
public class LogInvocationHandler implements InvocationHandler {
private Object target;
public LogInvocationHandler(Object target) {
this.target = target;
}
/**
* Proxy通过该方法,将交叉业务逻辑代码插入到目标对象的对应方法上<br>
* 织入
*
* @param obj 目标对象
* @param method 目标对象的方法
* @param args 方法的参数
*/
public Object invoke(Object obj, Method method, Object[] args)
throws Throwable {
//交叉业务逻辑
System.out.println("execute time " + new Date());
//调用目标对象的方法
Object rstObj = method.invoke(target, args);
return rstObj;
}
}
[align=center][i]切面[/i][/align]
public static void main(String[] args) {
ICustomerServiceProxy target = new CustomerServiceImpl();
target.register();
ICustomerServiceProxy proxy = (ICustomerServiceProxy) Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new LogInvocationHandler(target));
System.out.println(proxy.getClass().getName());
proxy.register();
}