spring jdk动态代理

public class DynamicProxyHandler {
    //被代理的对象
    private Object target;
    //事务管理器
    private TransactionManagerHandler txManager;
    /**
     * 返回一个代理对象,代理对象就做了方法的增强,(事物管理,日志控制,权限管理等等)
     */
    public <T> T getProxyObject(Class<T> clz) {
     
        /*
         * JDK内置有一个代理类,专门负责创建动态代理对象的,类
         * Proxy 类 , Proxy为被代理的对象创建代理对象
         *   理论上创建被代理对象,是需要被代理对象的类对应的字节码的
         * Proxy 在JVM动态的创建被代理对象的字节码,冬天的创建代理对象
         */
         
        /*
         * loader: 类加载器,类加载器就是从当前classpath下面加载字节码,在整个应用有且只有一个类加载器
         *      如何或者类加载器,
         *      方式一: 使用当前线程
         *      ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
         *       方式二: 使用任何一个类的字节码
         *      target.getClass().getClassLoader()
         * interfaces : 被代理对象的接口
         * h : 处理器: 真正做代码增强的地方
         */
        //代理对象
        Object newProxyInstance = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
            /**
             * 代理内的增强方法,正常增强的地方
             * @param proxy 代理对象
             * @param method 被代理对象的方法
             * @param args 被代理对象方法的参数
             * @return  被代理对象执行的结果
             * @throws Throwable
             */
 
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //执行被代理对象的方法
                Object result = null;
                try {
                    //方法之前执行操作
                    //开始事务
                    txManager.begin();
                    result = method.invoke(target, args);
                    //方法之后执行操作
                    //提交事物
                    txManager.commit();
                } catch (Exception e) {
                    //回滚事物
                    txManager.rollback();
                }finally {
                    txManager.close();
                }
                return result;
            }
        });
         
        //返回代理对象
        return (T) newProxyInstance;
    }
 
    public void setTarget(Object target) {
        this.target = target;
    }
 
    public void setTxManager(TransactionManagerHandler txManager) {
        this.txManager = txManager;
    }
}
 
 
 
配置文件
<!-- 配置事物管理器 -->
    <bean id="txMananger" class="cn.zj.spring.TransactionManagerHandler"/>
     
     
    <!-- 配置动态代理类 -->
    <bean id="dynamicProxy" class="cn.zj.spring.proxy.DynamicProxyHandler">
        <!-- 注入事物管理器 -->
        <property name="txManager" ref="txMananger"/>
         
        <!-- 配置被代理对象 -->
        <property name="target">
            <bean class="cn.zj.spring.service.impl.UserServiceImpl"/>
        </property>
    </bean>
 
 
 
    
测试代码
@RunWith(SpringJUnit4ClassRunner.class) // 表示先启动Spring容器,把junit运行在Spring容器中
@ContextConfiguration("classpath:applicationContext.xml") // 读取Spring的配置文件
public class DynamicProxyTest {
    // 自动注入 UserService
    @Autowired
    private DynamicProxyHandler proxy;
 
    @Test
    public void testInsert() throws Exception {
 
        // 获取代理类对象的中的获取动态代理对象的方法
        UserService proxyObject = proxy.getProxyObject(UserServiceImpl.class);
        proxyObject.insert("张三");
    }
    @Test
    public void testUpdate() throws Exception {
        // 获取代理类对象的中的获取动态代理对象的方法
        UserService proxyObject = proxy.getProxyObject(UserServiceImpl.class);
        proxyObject.update("李四");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值