Spring AOP 自定義注解的實現代碼
1.在Maven中加入以下以依賴:
<!-- Spring AOP + AspectJ by shipengzhi -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>3.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>3.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.11</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.11</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.1_3</version>
</dependency>
<!-- end -->
在spring-***.xml中加入spring支持,打開aop功能
頭文件聲明 :
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
<!-- 自定義AOP -->
<aop:aspectj-autoproxy proxy-target-class="true">
<aop:include name="controllerAspect" />
</aop:aspectj-autoproxy>
<bean id="controllerAspect" class="com.sogou.upd.passport.common.aspect.ControllerAspect"></bean>
//或:
<aop:aspectj-autoproxy>
編寫自定義注解。實現對方法所實現的功能進行描述,以便在通知中獲取描述信息
/*
* 校驗簽名合法性 自定義事務
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface SecureValid {
String desc() default "身份和安全驗證開始...";
}
@Target 用于描述注解的使用范圍(即:被描述的注解可以用在什么地方),其取值有:
|
取值 |
描述 |
|
CONSTRUCTOR |
用于描述構造器。 |
|
FIELD |
用于描述域。 |
|
LOCAL_VARIABLE |
用于描述局部變量。 |
|
METHOD |
用于描述方法。 |
|
PACKAGE |
用于描述包。 |
|
PARAMETER |
用于描述參數。 |
|
TYPE |
用于描述類或接口(甚至 enum )。 |
@Retention 用于描述注解的生命周期(即:被描述的注解在什么范圍內有效),其取值有:
|
取值 |
描述 |
|
SOURCE |
在源文件中有效(即源文件保留)。 |
|
CLASS |
在 class 文件中有效(即 class 保留)。 |
|
RUNTIME |
在運行時有效(即運行時保留)。 |
@Documented 在默認的情況下javadoc命令不會將我們的annotation生成再doc中去的,所以使用該標記就是告訴jdk讓它也將annotation生成到doc中去
@Inherited 比如有一個類A,在他上面有一個標記annotation,那么A的子類B是否不用再次標記annotation就可以繼承得到呢,答案是肯定的
Annotation屬性值 有以下三種: 基本類型、數組類型、枚舉類型
1:基本串類型
public @interface UserdefinedAnnotation {
intvalue();
String name();
String address();
}
使用:
@UserdefinedAnnotation(value=123,name="wangwenjun",address="火星")
public static void main(String[] args) {
System.out.println("hello");
}
}
如果一個annotation中只有一個屬性名字叫value,我沒在使用的時候可以給出屬性名也可以省略。
public @interface UserdefinedAnnotation {
int value();
}
也可以寫成如下的形式
@UserdefinedAnnotation(123) 等同于@UserdefinedAnnotation(value=123)
public static void main(String[] args) {
System.out.println("hello");
}
2:數組類型 我們在自定義annotation中定義一個數組類型的屬性,代碼如下:
public @interface UserdefinedAnnotation {
int[] value();
}
使用:
public class UseAnnotation {
@UserdefinedAnnotation({123})
public static void main(String[] args) {
System.out.println("hello");
}
}
注意1:其中123外面的大括號是可以被省略的,因為只有一個元素,如果里面有一個以上的元素的話,花括號是不能被省略的哦。比如{123,234}。
注意2:其中屬性名value我們在使用的時候進行了省略,那是因為他叫value,如果是其他名字我們就不可以進行省略了必須是@UserdefinedAnnotation(屬性名={123,234})這樣的格式。
3:枚舉類型
public enum DateEnum {
Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
}
然后在定義一個annotation
package com.wangwenjun.annatation.userdefined;
public @interface UserdefinedAnnotation {
DateEnum week();
}
使用:
public class UseAnnotation {
@UserdefinedAnnotation(week=DateEnum.Sunday)
public static void main(String[] args) {
System.out.println("hello");
}
}
4:默認值
public @interface UserdefinedAnnotation {
String name() default "zhangsan";
}
使用:
public class UseAnnotation {
@UserdefinedAnnotation()
public static void main(String[] args) {
System.out.println("hello");
}
}
5:注意
Annotation是不可以繼承其他接口的,這一點是需要進行注意,這也是annotation的一個規(guī)定吧。
Annotation也是存在包結構的,在使用的時候直接進行導入即可。
Annotation類型的類型只支持原聲數據類型,枚舉類型和Class類型的一維數組,其他的類型或者用戶自定義的類都是不可以作為annotation的類型,我查看過文檔并且進行過測試。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

