AOP的底層實現—之JKD的動態代理——(七)

JKD的動態代理

  • 新建項目
    在這裏插入圖片描述
  • 項目結構
    在這裏插入圖片描述

1.在src/main下創建Java源文件,創建包com.aop.demo1

2.在pom.xml內引入依賴

 <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter</artifactId>
      <version>RELEASE</version>
      <scope>compile</scope>
    </dependency>

3.創建UserDao接口

package com.aop.demo1;

public interface UserDao {
    public void save();

    public void upsate();

    public void delete();

    public void find();
}

4.創建UserDaoImpl接口

package com.aop.demo1;

public class UserDaoImpl implements UserDao{
    public void save() {
        System.out.println("保存用戶···");
    }

    public void upsate() {
        System.out.println("修改用戶···");
    }

    public void delete() {
        System.out.println("刪除用戶···");
    }

    public void find() {
        System.out.println("查詢用戶···");
    }
}

5.創建SpringDemo1測試類

package com.aop.demo1;

import org.junit.jupiter.api.Test;

public class SpringDemo1 {
    @Test
    public void demo1(){
        UserDao userDao = new UserDaoImpl();
//        原來的方法
//        userDao.save();
//        userDao.upsate();
//        userDao.delete();
//        userDao.find();
        UserDao proxy = (UserDao) new MyJdkProxy(userDao).createProxy();
        proxy.save();
        proxy.upsate();
        proxy.delete();
        proxy.find();
    }

}

6.創建MyJdkProxy類實現JKD動態代理

package com.aop.demo1;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class MyJdkProxy implements InvocationHandler {
    private UserDao userDao;

    public MyJdkProxy(UserDao userDao) {
        this.userDao = userDao;
    }

    public  Object createProxy(){
        Object proxy = Proxy.newProxyInstance(userDao.getClass().getClassLoader(),userDao.getClass().getInterfaces(),this);
        return proxy;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if ("save".equals(method.getName())){
            System.out.println("權限校驗");
            return method.invoke(userDao,args);
        }
        return method.invoke(userDao,args);
    }
}

7.輸出結果

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章