终于把Java设计模式中最复杂,最抽象的动态代理模式和AOP概念搞通了。其实也不是很难,跟struts2的interceptor原理一样,只是脑筋一时短路,想不过来,还得多谢俊哥。总之,再难的事也别放弃哈。说不定十步之遥,平步青天了呢....
代码如下:
//Model 和 Interface就不贴了
//需要植入的业务逻辑类,继承InvocationHandler接口
public class LoggerLogic implements InvocationHandler {
private Object target;
public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}
public void Logging(){
System.out.println("Logging business is start...");
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Logging();
method.invoke(target, args);
return null;
}
}
//接口实现,需要执行的业务逻辑类
public class UserDAOImpl implements UserDAOInterface{
public void save(UserModel u) {
System.out.println(u.getUsername() + " User is saved!");
}
}
//测试类
public class UserServiceTest {
@Test
public void testProxy() {
UserDAOInterface ui = new UserDAOImpl();
LoggerLogic logger = new LoggerLogic();
logger.setTarget(ui);
UserDAOInterface uiproxy = (UserDAOInterface) Proxy.newProxyInstance(ui
.getClass().getClassLoader(), ui.getClass().getInterfaces(),
logger);
UserModel um = new UserModel();
um.setUsername("Andy Lau");
uiproxy.save(um);
}
}
需要注意的是:
UserDAOInterface uiproxy = (UserDAOInterface) Proxy.newProxyInstance(ui.getClass().getClassLoader(), ui.getClass().getInterfaces(),logger);
//将接口的实现类交付给代理
这里一定要是个接口对象,而不是类!because 需要植入代码的话。只能使用接口,而不是能使用具体的类。。
uiproxy.save(); //不直接调用,而会交给代理,代理再去执行invocationhandle的invoke,invoke执行自己植入的业务逻辑,然后再执行business
Comments | NOTHING