一、方法和接口
public interface UserDao { //保存 public void save(); public void delete(); } public class UserDaoImpl implements UserDao{ @Override public void save() { System.out.println("保存用户"); } @Override public void delete() { System.out.println("删除用户"); } }
二、代理工厂
/** * 代理工厂 * 作用:创建代理类和代理对象 * @author Administrator * */ public class ProxyFactory { //声明目标对象 private Object target; public ProxyFactory(Object target) { this.target = target; } /** * 得到代理对象 * @return */ public Object getProxyInstance() { /** * 参数说明 * ClassLoader loader , 类加载器 * Class<?>[] interfaces, 目标类所实现的所有接口数组 * InvocationHandler h , 当代理对象被创建之后,调用目标对象的方法时触发的方法回调 */ return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() { /** * proxy 代理对象 * method 用户要调用的目标对象的方法 * args 目标对象的方法的参数 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { begin();//前置加强 //执行目标对象的方法 Object invoke = method.invoke(target, args); commit();//后置加强 return invoke; } }); } private void commit() { System.out.println("提交事务"); } private void begin() { System.out.println("得到session"); System.out.println("开启事务"); } }
三、测试
public class Test { public static void main(String[] args) { //创建目标对象 UserDao userDao = new UserDaoImpl(); //创建代理工厂对象 ProxyFactory daoFactory = new ProxyFactory(userDao); //得到代理对象 UserDao proxyDao = (UserDao) daoFactory.getProxyInstance(); proxyDao.save(); } }
原文:https://www.cnblogs.com/97guoxiang/p/12789865.html