运用JDK中的InvocationHandler、Proxy完成动态署理itjob - AG环亚娱乐

运用JDK中的InvocationHandler、Proxy完成动态署理itjob

2019-02-13 08:09:50 | 作者: 怜南 | 标签: 运用,办法,逻辑 | 浏览: 3437

动态署理(Dynamic Proxy)
一、切面编程(在办法前后加上一些逻辑,如下:在save(User user)办法前后加逻辑)
准备工作:
public class UserDAOImpl {
 public void save(User user) {
 System.out.println("user saved!");
}

1、完成办法一:直接在办法里边逻辑前后进行增加
public class UserDAOImpl implements UserDAO {
 public void save(User user) {
 System.out.println("user start"); //在办法前增加逻辑
 System.out.println("user saved!");
}

2、完成办法二:运用承继进行增加
public class UserDAOImpl2 extends UserDAOImpl {
 @Override
 public void save(User user) {
 System.out.println("user start"); //在办法前增加逻辑
 super.save(user);
}

3、完成办法三:运用接口进行增加
增加接口UserDAO
public interface UserDAO {
 public void save(User user);
}

让UserDAOImpl承继接口
public class UserDAOImpl implements UserDAO {
 public void save(User user) {
 System.out.println("user saved!");
}

让UserDAOImpl2承继接口
public class UserDAOImpl2 implements UserDAO {
 private UserDAOImpl userDAOImpl = new UserDAOImpl();
 public void save(User user) {
 System.out.println("user start"); //在办法前增加逻辑
 userDAOImpl.save(user);
}

小总结:三种办法中,运用接口和组合最为适宜,可是假如要增加逻辑的办法非常多,并且因承继接口而构成的结构非常复杂的时分,能够运用动态署理来协助完成。
二、运用动态署理增加逻辑
将所需求增加的逻辑封装成一个类,让其承继InvocationHandler接口
public class LogInterceptor implements InvocationHandler {
 private Object target; //需求增加逻辑的目标
 public LogInterceptor(Object target) {
 this.target = target;
 public void log(Method m) {
 System.out.println(m.getName() + " start");
 * proxy 署理目标
 * method 署理目标要履行的办法
 * args 所需履行办法的参数
 public Object invoke(Object proxy, Method method, Object[] args)
 throws Throwable {
 log(method); //在履行办法前增加逻辑
 method.invoke(target , args);
 return null;
}

运用Proxy取得署理目标,署理目标与被署理目标要完成相同的接口
public class TestProxy {
 * userDAO 要署理的目标,完成了UserDAO接口
 * li 给署理增加逻辑的类
 * proxy 经过Proxy的静态办法生成的署理目标
 * 署理目标与被署理的目标的ClassLoader要相同
 * 经过传入的参数,完成与署理目标相同的接口
 public void testProxy() {
 UserDAO userDAO = new UserDAOImpl();
 LogInterceptor li = new LogInterceptor(userDAO); 
 UserDAO proxy = (UserDAO)Proxy.newProxyInstance(
 userDAO.getClass().getClassLoader(), new Class[]{UserDAO.class}, li);
 proxy.save(new User());
 proxy.delete();
}

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表AG环亚娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章