1. 程式人生 > >AOP動態代理

AOP動態代理

imp @override 增強 private spring delete 根據 用戶 權限

1.JDK動態代理

UserDao類:

public interface UserDao {
    public void addUser();
}

UserDaoImpl類:

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

MyAspect切面:

public class MyAspect {
    public void check_permissions(){
        System.out.println(
"檢查權限"); } public void log(){ System.out.println("記錄日誌"); } }

JdkProxy代理類:

public class JdkProxy implements InvocationHandler {
    private UserDao userDao;

    public Object createProxy(UserDao userDao) {
        this.userDao = userDao;
        //1.類加載器
        ClassLoader loader = JdkProxy.class
.getClassLoader(); //2.被代理對象實現的所有接口 Class[] classes = userDao.getClass().getInterfaces(); //3.使用代理類進行增強,返回代理後的對象 return Proxy.newProxyInstance(loader, classes, this); } /** * @param proxy 被代理後的對象 * @param method 將要被執行方法的信息 * @param args 執行方法時需要的參數 *
@return * @throws Throwable */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //創建切面 MyAspect myAspect = new MyAspect(); //前增強 myAspect.check_permissions(); //調用方法,並傳參 Object obj = method.invoke(userDao, args); //後增強 myAspect.log(); return obj; } }

Test測試類:

public class Test {
    public static void main(String[] args) {
        //創建代理對象
        JdkProxy jdkProxy = new JdkProxy();
        //創建目標對象
        UserDao userDao = new UserDaoImpl();
        //從代理對象中獲取增強後的對象
        UserDao userDao1 = (UserDao) jdkProxy.createProxy(userDao);
        userDao1.addUser();
    }
}

運行結果:

技術分享圖片

2.CGLIB代理

UserDao類:

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

MyAspect切面類同上

CglibProxy代理類:

import com.chauncey.jdk.MyAspect;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;

public class CglibProxy implements MethodInterceptor {
    public Object createProxy(Object target){
        //創建動態對象
        Enhancer enhancer = new Enhancer();
        //確定要增強的類
        enhancer.setSuperclass(target.getClass());
        //添加回調函數
        enhancer.setCallback(this);
        //返回代理類
        return enhancer.create();
    }

    /**
     *
     * @param o CGLIB根據指定父類生成對象
     * @param method 攔截的方法
     * @param objects 攔截方法參數的數組
     * @param methodProxy 方法的代理對象,用於執行父類方法
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {

        MyAspect myAspect = new MyAspect();
        myAspect.check_permissions();
        Object obj = methodProxy.invokeSuper(o,objects);
        myAspect.log();
        return null;
    }
}

Test測試類:

public class Test {
    public static void main(String[] args) {
        //創建代理對象
        CglibProxy proxy = new CglibProxy();
        //創建目標類
        UserDao userDao = new UserDao();
        //獲取增強後的目標對象
        UserDao userDao1 = (UserDao) proxy.createProxy(userDao);
        userDao1.delete();
    }
}

運行結果:

技術分享圖片

AOP動態代理