动态代理

一、方法和接口

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();
    }
}

 

posted @ 2020-04-27 20:33  青青子衿啊  阅读(287)  评论(0)    收藏  举报