Spring(5) - (11)CGLIB动态代理

2018-09-26  本文已影响15人  小白201808

特点:

 1.可以针对没有接口的,使用继承真正类的方式implements IEmployeeServiceImpl

注意⚠️:public class TransactionManagerAdvice implements InvocationHandler{}

此时的InvocationHandler是rg.springframework.cglib.proxy.InvocationHandler 的 InvocationHandler,导入包的时候注意,别导错

主要代码:

package com.keen.proxy.tx;

import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.InvocationHandler;
@SuppressWarnings("all")//忽略所有警告
public class TransactionManagerAdvice implements InvocationHandler{
    private Object targer;//真实对象,即对谁做增强
    private TransactionManager txManager;//事务管理器(模拟)
    
    public void setTarger(Object targer) {
        this.targer = targer;
    }
    public void setTxManager(TransactionManager txManager) {
        this.txManager = txManager;
    }
    
    //创建一个代理对象
    public <T> T getProxyObject() {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(targer.getClass());//将继承于哪个类,去做增强
        enhancer.setCallback(this);//设置增强的对象
        return (T) enhancer.create();//创建代理对象
    }
    @Override
    //如何为真实对象的方法增强的具体操作
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object ret = null;
        txManager.begin();
        //调用真实对象的方法
          try {
            ret = method.invoke(targer, args);//调用对象真实的方法
            txManager.commit();
        } catch (Exception e) {
            
            e.printStackTrace();
            txManager.rollback();
        }
        return ret;
    }
}

测试类

public class AutoTest {
    @Autowired 
    private TransactionManagerAdvice advice;
    
    
    @Test
    void testSave() throws Exception {
        //获取代理对象 jdk :class com.sun.proxy.$Proxy19
        //cglib:class com.keen.proxy.service.IEmployeeServiceImpl$$EnhancerByCGLIB$$ec7415fa
         IEmployeeServiceImpl proxy = advice.getProxyObject();
         //System.out.println(proxy.getClass());
         proxy.save(new Employee());
    }
    @Test
    void testUpdate() throws Exception {
         IEmployeeServiceImpl proxy = advice.getProxyObject();
         //System.out.println(proxy.getClass());
         proxy.update(new Employee());
        
        
        
    }
上一篇 下一篇

猜你喜欢

热点阅读