初始spring(八)

来源:互联网 发布:软件测试平均工资 编辑:程序博客网 时间:2024/06/02 13:13

spring代理之动态代理

IUserDao.java

package cn.itcast.b_dynamic;// 接口public interface IUserDao {    void save();}

UserDao.java

package cn.itcast.b_dynamic;/** * 目标对象 * @author Jie.Yuan * */public class UserDao implements IUserDao{    @Override    public void save() {        System.out.println("-----已经保存数据!!!------");    }}

创建代理工厂

package cn.itcast.b_dynamic;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * 给所有的dao创建代理对象【动态代理】 *  * 代理对象,不需要实现接口 * @author Jie.Yuan * */public class ProxyFactory {    // 维护一个目标对象    private Object target;    public ProxyFactory(Object target){        this.target = target;    }    // 给目标对象,生成代理对象      public Object getProxyInstance() {        return Proxy.newProxyInstance(                target.getClass().getClassLoader(),                 target.getClass().getInterfaces(),                new InvocationHandler() {                    @Override                      public Object invoke(Object proxy, Method method, Object[] args)                            throws Throwable {                        System.out.println("开启事务");                        // 执行目标对象方法                        Object returnValue = method.invoke(target, args);                        System.out.println("提交事务");                        return returnValue;                    }                });    }}

App.java

package cn.itcast.b_dynamic;public class App {    public static void main(String[] args) {        // 目标对象        IUserDao target = new UserDao();        // 【原始的类型 class cn.itcast.b_dynamic.UserDao】        System.out.println(target.getClass());        // 给目标对象,创建代理对象        IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();        // class $Proxy0   内存中动态生成的代理对象    }}

运行结果:

开始事务…
—–已经保存数据!!!——
提交事务…

0 0
原创粉丝点击