1. 用戶管理業務邏輯接口(UserManagerApplogic.java )java
package com.iteye.applogic; app
public interface UserManagerApplogic { 函數
public void addUser(String name); spa
} .net
2. 用戶管理業務邏輯實現類(UserManagerApplogicImpl.java)component
package com.iteye.applogic.impl; xml
import org.springframework.stereotype.Component; blog
import com.iteye.applogic.UserManagerApplogic;
import com.iteye.annotation.BussAnnotation;
@Component("userManager")
public class UserManagerApplogicImpl implements UserManagerApplogic {
@BussAnnotation(moduleName="人員管理",option="添加用戶")
public void addUser(String name) {
System.out.println("add a User!Name is "+name);
}
}
3.業務註釋類(BusAnnotation.java)
package com.iteye.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target ({ElementType.METHOD})
public @interface BussAnnotation {
//模塊名
String moduleName();
//操做內容
String option();
}
(1)RetentionPolicy(保留策略)是一個enum類型,共有三個值,分別是SOURCE,CLASS 和 RUNTIME。
SOURCE 表明的是這個Annotation類型的信息只會保留在程序源碼裏,源碼若是通過了編譯以後,Annotation的數據就會消失,並不會保留在編譯好的.class文件裏面。
ClASS的 表明的是這個Annotation類型的信息保留在程序源碼裏,同時也會保留在編譯好的.class文件裏面,在執行的時候,並不會把這一些信息加載到虛擬機(JVM)中去.注意一下,當你沒有設定一個Annotation類型的Retention值時,系統默認值是CLASS。
RUNTIME表明的是表示在源碼、編譯好的.class文件中保留信息,在執行的時候會把這一些信息加載到JVM中去的。
(2)ElementType
@Target裏面的ElementType是用來指定Annotation類型能夠用在哪一些元素上的.
TYPE(類型)是指能夠用在Class,Interface,Enum和Annotation類型上.
FIELD(屬性)
METHOD(方法)
PARAMETER(參數)
CONSTRUCTOR(構造函數)
LOCAL_VARIABLE(局部變量)
ANNOTATION_TYPE
PACKAGE(包)
(3)@Documented
@Documented的目的就是讓這一個Annotation類型的信息可以顯示在javaAPI說明文檔上;沒有添加的話,使用javadoc生成API文檔的時候就會找不到這一個類型生成的信息。
(4)@Inherited
若是須要把Annotation的數據繼承給子類,那麼就會用到@Inherited這一個Annotation類型。
4.切面類(LogInterceptor.java)
package com.iteye.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import com.iteye.annotation.BussAnnotation;
@Aspect
@Component
public class LogInterceptor {
@Pointcut("execution(public * com.iteye..*.addUser(..))")
public void aApplogic() {}
@Around(value = "aApplogic() && @annotation(annotation) &&args(object,..) ", argNames = "annotation,object")
public Object interceptorApplogic(ProceedingJoinPoint pj,
BussAnnotation annotation, Object object) throws Throwable {
System.out.println("moduleName:"+annotation.moduleName());
System.out.println("option:"+annotation.option());
pj.proceed();
return object;
}
}
5.配置文件(applicationContext-aop.xml)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<context:annotation-config />
<context:component-scan base-package="com.iteye"/>
<aop:aspectj-autoproxy />
</beans>