什么是AOP我們先來看一張圖

圖中A就是通知,比如你要給每個方法前都加一個before()
方法,目標類的每一個方法叫joinpoint(切入點),每個切入點都會用到通知,把通知和切入點連起來,點成線,線成面,這就是切面,也就是AOP,下面我們來簡單寫個小例子來實現一下
目標類的接口
1 | public interface UserService { |
2 | public void addUser() ; |
3 | public void updateUser(); |
4 | public void deleteUser(); |
目標類接口的實現
01 | public class UserServiceImpl implements UserService { |
03 | public void addUser() { |
04 | System.out.println( "addUser" ); |
07 | public void updateUser() { |
08 | System.out.println( "updateUser" ); |
11 | public void deleteUser() { |
12 | System.out.println( "deleteUser" ); |
通知類
3 | System.out.println( "before" ); |
6 | System.out.println( "after" ); |
代理類
01 | public class MyBeanFactory { |
02 | public static UserService createService(){ |
04 | final UserService userService = new UserServiceImpl() ; |
06 | final MyAspect myAspect = new MyAspect(); |
16 | UserService proxyService = (UserService) Proxy.newProxyInstance(MyBeanFactory. class .getClassLoader(), |
17 | userService.getClass().getInterfaces(), |
18 | new InvocationHandler() { |
20 | public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { |
21 | System.out.println(method.getName()); |
23 | Object obj = method.invoke(userService, args); |
測試類
1 | public class UserServiceImplTest { |
2 | @org .junit.jupiter.api.Test |
3 | public void demo() throws Exception { |
4 | UserService userService = MyBeanFactory.createService(); |
6 | userService.deleteUser(); |
7 | userService.updateUser(); |
結果
addUser
before
addUser
after
deleteUser
before
deleteUser
after
updateUser
before
updateUser
after
Process finished with exit code 0
我們可以看到每個方法都執行了通知,用了動態代理就不用手動的給每個方法前后加入通知,這樣既節省了時間,也保證了主體代碼不被改變
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。