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