什么是AOP我們先來看一張圖
圖中A就是通知,比如你要給每個方法前都加一個before()
方法,目標類的每一個方法叫joinpoint(切入點),每個切入點都會用到通知,把通知和切入點連起來,點成線,線成面,這就是切面,也就是AOP,下面我們來簡單寫個小例子來實現一下
目標類的接口
public interface UserService { public void addUser() ; public void updateUser(); public void deleteUser();}
目標類接口的實現
public class UserServiceImpl implements UserService { @Override public void addUser() { System.out.println("addUser"); } @Override public void updateUser() { System.out.println("updateUser"); } @Override public void deleteUser() { System.out.println("deleteUser"); }}
通知類
public class MyAspect { public void before(){ System.out.println("before"); } public void after(){ System.out.println("after"); }}
代理類
public class MyBeanFactory { public static UserService createService(){ //1.目標類 final UserService userService = new UserServiceImpl() ; //2.切面類 final MyAspect myAspect = new MyAspect();// 切入點和切面類結合// 三個參數// 1. loader ,類加載器 運行是加載,用類加載器將其加載到內存// 2. interfaces 代理類需要實現的所有接口// 3. invocationHandler 處理類,一般采用匿名內部類// 提供了invoke方法 代理類每個方法執行時都將調用一次invoke ,又有三個參數// 1. Object proxy 代理對象// 2. Method method 代理對象方法的反射// 3. Object[] args 方法的實際參數 UserService proxyService = (UserService) Proxy.newProxyInstance(MyBeanFactory.class.getClassLoader(), userService.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(method.getName()); myAspect.before(); Object obj = method.invoke(userService, args); myAspect.after(); return obj ; } }); return proxyService ; }}
測試類
public class UserServiceImplTest { @org.junit.jupiter.api.Test public void demo() throws Exception { UserService userService = MyBeanFactory.createService(); userService.addUser(); userService.deleteUser(); userService.updateUser(); }}
結果
addUser
before
addUser
after
deleteUser
before
deleteUser
after
updateUser
before
updateUser
after
Process finished with exit code 0
我們可以看到每個方法都執行了通知,用了動態代理就不用手動的給每個方法前后加入通知,這樣既節省了時間,也保證了主體代碼不被改變
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網的支持。
新聞熱點
疑難解答
圖片精選