1. 程式人生 > 其它 >Spring的動態代理(CGLib代理模式)

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);
}