Java Spring中的動(dòng)態(tài)代理cglib

總結(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

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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容