華為機試演算法題
阿新 • • 發佈:2020-12-11
技術標籤:JAVAEE企業級應用開發教程
什麼是AOP?
將分散在各個方法中重複的程式碼提取出來,然後在程式編譯或執行時,再將這些提取出來的程式碼應用到需要執行的地方
AOP術語
點選此處學習AOP術語
在切面覆蓋下的類裡面,任何物件方法的呼叫都被叫做連線點。
切面 只是一個類,但是這個類只有在Spring容器中被配置才能被識別為切面
切入點就是 需要處理的連線點
通知增強處理就是 切入點需要執行的程式程式碼,就是切面類中的某個方法
目標物件就是 執行了切面類中方法的一個類。
代理是 在“動態的AOP”方法中,被動態建立的虛擬物件。
織入也就是 生成代理物件的過程
package com. csdn2.AOP;
public interface UserDao {
public void add();
public void delete();
}
package com.csdn2.AOP;
public class UserDaoImplement implements UserDao{
@Override
public void add() {
// TODO Auto-generated method stub
System.out.println("com.csdn2.AOP.UserDaoImplement:新增方法");
}
@Override
public void delete() {
// TODO Auto-generated method stub
System.out.println("com.csdn2.AOP.UserDaoImplement:刪除方法");
}
}
package com.csdn2.AOP;
public class Aspect {
public void check() {
System.out.println("com.csdn2.AOP.Aspect:模擬檢查操作......");
}
public void log() {
System.out.println("com.csdn2.AOP.Aspect:模擬記錄操作......");
}
}
package com.csdn2.AOP;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JdkProxy implements InvocationHandler{
//宣告目標物件
UserDao userDao;
public Object createProxy(UserDao userDao) {
this.userDao=userDao;
//1、類載入器
ClassLoader classLoader=JdkProxy.class.getClassLoader();
//2、被代理物件所有介面
Class[] clazz=userDao.getClass().getInterfaces();
//3、使用代理類,進行增強,返回的是代理後的物件
return Proxy.newProxyInstance(classLoader, clazz, this);
}
//所有動態代理類的方法呼叫,都會交由invoke()方法去處理
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
//1、宣告切面
Aspect aspect=new Aspect();
//2、前增強
aspect.check();
//3、再在目標類上呼叫方法,並傳入引數
Object obj=method.invoke(userDao, args);
//3、後增強
aspect.log();
return obj;
}
}
package com.csdn2.AOP;
public class JdkTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
//建立代理物件
JdkProxy jdkProxy=new JdkProxy();
//建立目標物件
UserDao userDao=new UserDaoImplement();
//從代理物件中獲取增強後的目標物件
UserDao userDao2=(UserDao)jdkProxy.createProxy(userDao);
//執行方法
userDao2.add();
System.out.println();
userDao2.delete();
}
}
執行結果