javascript
SpringBoot AOP注解写法
1.Spring AOP五種通知詳情
1)環繞通知 @Around 環繞通知圍繞在連接點前后
2)前置通知 @Before 在連接點前面執行
方法進行
3)環繞通知 @Around 環繞通知圍繞在連接點前后
4)后置通知 @After 在連接點執行完成后執行,不管是正常執行完成,還是拋出異常,都會執行返回通知中的內容
5)正常返回通知 @AfterReturning 在連接點正常執行完成后執行,如果連接點拋出異常,則不會執行
2.切入點指示符
execution 用于匹配方法執行的連接點;
within 用于匹配指定類型內的方法執行;
this 用于匹配當前AOP代理對象類型的執行方法;注意是AOP代理對象的類型匹配,這樣就可能包括引入接口也類型匹配;
target 用于匹配當前目標對象類型的執行方法;注意是 目標對象的類型匹配,這樣就不包括引入接口也類型匹配;
args 用于匹配當前執行的方法傳入的參數為指定類型的執行方法;
@within 用于匹配所以持有指定注解類型內的方法;
@target 用于匹配當前目標對象類型的執行方法,其中目標對象持有指定的注解;
@args 用于匹配當前執行的方法傳入的參數持有指定注解的執行;
@annotation 用于匹配當前執行方法持有指定注解的方法;
bean Spring AOP擴展的,AspectJ沒有對于指示符,用于匹配特定名稱的Bean對象的執行方法;
reference pointcut 表示引用其他命名切入點,只有@ApectJ風格支持,Schema風格不支持。
3.AOP切入點詳解
1)execution(public * (…)) 匹配所有的public修飾符的方法
execution( com.test.method.des….(…))
1, execution() 表達式的主體
2, 第一個“”符號 表示返回值的類型任意
3, com.test.method.des AOP所切的服務的包名,即,需要進行橫切的業務類
4, 包名后面的“…” 表示當前包及子包
5, 第二個“” 表示類名,即所有類
6, .(…) 表示任何方法名,括號表示參數,兩個點表示任何參數類型
范例
- public * *(…) 任何公共方法的執行
- com.learn…IHelloService.*() com.learn包及所有子包下IHelloService接口中的任何無參方法
- com.learn….(…) com.learn包及所有子包下任何類的任何方法
- com.learn…IHelloService.() com.learn包及所有子包下IHelloService接口的任何只有一個參數方法
- (!com.learn…IHelloService+).*(…) 非“com.learn包及所有子包下IHelloService接口及子類型”的任何方法
- com.learn…IHelloService+.() com.learn包及所有子包下IHelloService接口及子類型的的任何無參方法
com.learn…IHelloService.test(java.util.Date) com.learn包及所有子包下IHelloService前綴類型的的以test開頭的只有一個參數類型為java.util.Date的方法,注意該匹配是根據方法簽名的參數類型進行匹配的,而不是根據執行時傳入的參數類型決定的,如定義方法:public void test(Object obj);即使執行時傳入java.util.Date,也不會匹配的;
*com.learn…IHelloService.test(…) throws IllegalArgumentException, ArrayIndexOutOfBoundsException com.learn包及所有子包下IHelloService前綴類型的的任何方法,且拋出IllegalArgumentException和ArrayIndexOutOfBoundsException異常 - (com.learn…IHelloService+ && java.io.Serializable+).*(…) 任何實現了com.learn包及所有子包下 IHelloService接口和java.io.Serializable接口的類型的任何方法
@java.lang.Deprecated * *(…) 任何持有@java.lang.Deprecated注解的方法
@(java.lang.Deprecated || com.learn…Secure) * *(…) 任何持有@java.lang.Deprecated或@com.learn…Secure注解的方法
(@com.learn…Secure *) *(…) 任何返回值類型持有@com.learn…Secure的方法 - (@com.learn…Secure ).(…) 任何定義方法的類型持有@com.learn…Secure的方法
- (@com.learn…Secure () , @com.learn…Secure (*)) 任何簽名帶有兩個參數的方法,且這個兩個參數都被@Secure標記了,如public void test(@Secure String str1, @Secure String str1)
- *((@ com.learn…Secure *))或 * *(@ com.learn…Secure *) 任何帶有一個參數的方法,且該參數類型持有@com.learn…Secure;如public void test(Model model);且Model類上持有@Secure注解
- *( @com.learn…Secure (@com.learn…Secure *) , @ com.learn…Secure (@com.learn…Secure *)) 任何帶有兩個參數的方法,且這兩個參數都被@com.learn…Secure標記了;且這兩個參數的類型上都持有@ com.learn…Secure;
*( java.util.Map<com.learn…Model, com.learn…Model> , …) 任何帶有一個java.util.Map參數的方法,且該參數類型是以< com.learn…Model, com.learn…Model >為泛型參數;注意只匹配第一個參數為java.util.Map,不包括子類型;如public void test(HashMap<Model, Model> map, String str);將不匹配,必須使用“ *( java.util.HashMap<com.learn…Model,com.learn…Model> , …)”進行匹配; 而public void test(Map map, int i);也將不匹配,因為泛型參數不匹配 * *(java.util.Collection<@com.learn…Secure *>) 任何帶有一個參數(類型為java.util.Collection)的方法,且該參數類型是有一個泛型參數,該泛型參數類型上持有@com.learn…Secure注解; 如public void test(Collection collection);Model類型上持有@com.learn…Secure * *(java.util.Set<? extends HashMap>) 任何帶有一個參數的方法,且傳入的參數類型是有一個泛型參數,該泛型參數類型繼承與HashMap; Spring AOP目前測試不能正常工作 - *(java.util.List<? super HashMap>) 任何帶有一個參數的方法,且傳入的參數類型是有一個泛型參數,該泛型參數類型是HashMap的基類型;如public voi test(Map map);Spring AOP目前測試不能正常工作
- (<@com.learn…Secure *>) 任何帶有一個參數的方法,且該參數類型是有一個泛型參數,該泛型參數類型上持有@com.learn…Secure注解;Spring AOP目前測試不能正常工作
4.demo
2.創建注解
//作用域 作用于方法和類上 @Target(value = {ElementType.METHOD,ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented //表示把注解生成在Javadoc中 @Inherited //表示可以被繼承 public @interface MySecure {//注解的參數:類型+參數名()[default 默認值];String name() default "";String[] role() default {"user"}; }4.測試 (UserServcie的包com.example.demo.aop.service)
@Service public class UserServcie {@MySecure(role = {"admin"})public void login(String username,String password){System.out.println("=======這是一個登錄方法========");} }打印結果
總結
以上是生活随笔為你收集整理的SpringBoot AOP注解写法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android如何编译lame,ndk编
- 下一篇: JS this详解