Spring的动态代理(CGLib代理模式)


在使用CGLib动态代理的时候,其与jdk的动态代理的区别是,1.CGLib可以直接代理一个实现类。2.在我们使用CGLib的时候需要用到Enhancer enhancer = new Enhancer()方法,而jdk使用的是需要使用Proxy.newProxyInstance()方法,返回我们的实体类的接口对象。

 

使用步骤:

1、利用静态代理中的核心类(这个核心类是静态和动态所需的)

2、在创建个类(xxxProxy)来实现InvocationHandler接口

3、在实现InvocationHandler后,进行重新里面的方法

 

/**
* 使用CGLib动态代理
*/
@Component
public class CGLib implements InvocationHandler {
/**
* 这此我们依旧需要把我们代理的实体类进行注入
*/
@Resource(name = "userServiceImpl1")
private Object object;

public Object getObject() {
return object;
}

// 把我们的事务处理器进行注入使用
@Resource
private TManager tManager;

public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
Object invoke=null;
try {
tManager.closeCommit();
invoke= method.invoke(object, objects);
tManager.commit();
} catch (SQLException e) {
tManager.rollBack();
e.printStackTrace();
}
return invoke;
}
}

 

4、编写一个测试类使用CGLib代理方法

 

    /**
* 使用CGLib进行动态代理
*/
@Resource
private CGLib cgLib;

@Test
public void text() throws SQLException {
Enhancer enhancer = new Enhancer();
// 设置父类,因为cglib是针对指定的类派生出一个子类,所以需要指定父类
enhancer.setSuperclass(cgLib.getObject().getClass());
enhancer.setCallback(cgLib);
Object o = enhancer.create();
UserServiceImpl1 userServiceImpl1=(UserServiceImpl1)o;
User user = new User();
user.setName("枫");
user.setPassword("201619");
userServiceImpl1.inserts(user);
}

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM