AOP動態代理
阿新 • • 發佈:2019-03-12
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動態代理