總結(jié)
JDK的動(dòng)態(tài)代理和 Spring中的動(dòng)態(tài)代理cglib區(qū)別
- JDK 的動(dòng)態(tài)代理 :針對(duì)實(shí)現(xiàn)了接口的類產(chǎn)生代理.
- Cglib 的動(dòng)態(tài)代理 :針對(duì)沒有實(shí)現(xiàn)接口的類產(chǎn)生代理. 通過生成實(shí)現(xiàn)類類的子類對(duì)象來產(chǎn)生代理.
1.什么是動(dòng)態(tài)代理技術(shù)
1.1 動(dòng)態(tài)代理技術(shù)是面向切面編程的一種思想(aop)僚饭。
1.2 思想模型
Snip20180605_22.png
Snip20180605_22.png
2.動(dòng)態(tài)代理技術(shù)的好處
可以動(dòng)態(tài)的在B實(shí)現(xiàn)類的doSomething()方法前后晕讲,添加一些其他的操作方法,對(duì)方法進(jìn)行增強(qiáng)狼犯。
3.案例講解
3.1 場(chǎng)景模擬
在操作數(shù)據(jù)庫之前羊异,我們都需要開啟事物济舆,當(dāng)操作完畢之后還要提交事物贰锁,但是如果在每一個(gè)操作數(shù)據(jù)庫的方法中都要調(diào)用一次的話就會(huì)顯得很繁瑣了,所以我們?cè)趧?dòng)態(tài)代理中統(tǒng)一進(jìn)行處理省核。
3.2 代碼演示
3.2.1 準(zhǔn)備一個(gè)接口
public interface UserService {
void save();
void delete();
void update();
void find();
}
3.2.2 準(zhǔn)備一個(gè)實(shí)現(xiàn)類
package cn.jianghai.service;
public class UserServiceImpl implements UserService{
@Override
public void save() {
System.out.println("保存用戶!");
}
@Override
public void delete() {
System.out.println("刪除用戶!");
}
@Override
public void update() {
System.out.println("更新用戶!");
}
@Override
public void find() {
System.out.println("查找用戶!");
}
}
3.2.3 準(zhǔn)備一個(gè)動(dòng)態(tài)代理類
public class UserServiceProxyFactory implements MethodInterceptor {
public UserService getUserServiceProxy() {
Enhancer enhancer = new Enhancer(); //幫我們生成代理對(duì)象
enhancer.setSuperclass(UserServiceImpl.class); // //設(shè)置對(duì)誰進(jìn)行代理
enhancer.setCallback(this); // 設(shè)置代理回調(diào)方法
UserService userService = (UserService) enhancer.create(); //創(chuàng)建代理對(duì)象
return userService;
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
//打開事務(wù)
System.out.println("打開事務(wù)!");
//調(diào)用原有方法
Object returnValue = methodProxy.invokeSuper(o, objects);
//提交事務(wù)
System.out.println("提交事務(wù)!");
return returnValue;
}
}
3.2.4 測(cè)試
public class Demo {
@Test
public void func(){
UserServiceProxyFactory userServiceProxyFactory = new UserServiceProxyFactory();
UserService userServiceProxy = userServiceProxyFactory.getUserServiceProxy();
userServiceProxy.save();
//判斷代理對(duì)象是否屬于被代理對(duì)象類型
//代理對(duì)象繼承了被代理對(duì)象=>true
System.out.println(userServiceProxy instanceof UserServiceImpl);//true
}
}
查看測(cè)試結(jié)果
Snip20180605_25.png