AOP實(shí)現(xiàn)原理:1.JDK動(dòng)態(tài)代理

1.概念:AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。
使用這種AOP方式要求目標(biāo)類有接口+實(shí)現(xiàn)類,如沒有接口只有實(shí)現(xiàn)類,則要使用CGLIB的方式。
2.術(shù)語:
2.1 target:目標(biāo)類,需要被代理的類。例如:UserService
2.2 Joinpoint(連接點(diǎn)):所謂連接點(diǎn)是指那些可能被攔截到的方法。例如:所有的方法
2.3 PointCut 切入點(diǎn):已經(jīng)被增強(qiáng)的連接點(diǎn)。例如:addUser()
2.4 advice 通知/增強(qiáng),增強(qiáng)代碼。例如:after、before
2.5 Weaving(織入):是指把增強(qiáng)advice應(yīng)用到目標(biāo)對象target來創(chuàng)建新的代理對象proxy的過程.
2.6 proxy 代理類
2.7 Aspect(切面): 是切入點(diǎn)pointcut和通知advice的結(jié)合
一個(gè)線是一個(gè)特殊的面。
一個(gè)切入點(diǎn)和一個(gè)通知,組成成一個(gè)特殊的面。
3.代碼
3.1 創(chuàng)建IUserService的接口

public interface IUserService {
//    面向切面編程
    public void addUser();
    public void updateUser();
    public int deleteUser(int id);
}

3.2 UserServiceImpl類實(shí)現(xiàn)IUserService接口

public class UserServiceImpl implements IUserService {
    @Override
    public void addUser() {
        System.out.println("Service 添加用戶");
    }

    @Override
    public void updateUser() {
        System.out.println("Service 更新用戶");

    }

    @Override
    public int deleteUser(int id) {
        System.out.println("Service 通過id刪除用戶");

        return 1;
    }
}

3.3 聲明一個(gè)面向切面的對象,如我這里寫的是MyAspect

//切面類,代碼增強(qiáng)與切入點(diǎn)的結(jié)合
public class MyAspect {
    public void before(){
        System.out.println("開啟事務(wù)");
    }

    public void after(){
        System.out.println("提交事務(wù)");
    }
}

3.4 實(shí)現(xiàn)一個(gè)UserService的工廠類

public class UserServiceFactory {
    public static IUserService createUserService(){
//        1.創(chuàng)建目標(biāo)對象target
        IUserService userService = new UserServiceImpl();

//        2.聲明切面類對象
        MyAspect aspect = new MyAspect();
//        3.把切面類2個(gè)方法 應(yīng)用 目標(biāo)類
//        3.1 創(chuàng)建JDK代理
        IUserService serviceProxy = (IUserService) Proxy.newProxyInstance(UserServiceFactory.class.getClassLoader(), userService.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("方法名:"+method.getName());
                System.out.println("參數(shù):"+args);

//                開始事務(wù)
                aspect.before();
                Object o = method.invoke(userService,args);
                System.out.println("JDK代理攔截返回值"+o);
//                結(jié)束事務(wù)
                aspect.after();
                return o;
            }
        });

        return serviceProxy;
    }
}

3.5 測試

public class Test {
    @Test
    public void Test(){
        IUserService userService = UserServiceFactory.createUserService();
        userService.deleteUser(10);
        userService.add();
        userService.updateUser();
    }
}

結(jié)果如下:


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

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