Javad设计模式-动态代理和AOP概念

发布于 2010-11-15  40.8k 次阅读


终于把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