Spring的動態代理(CGLib代理模式)
阿新 • • 發佈:2022-04-04
在使用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);
}