Spring AOP 實現業務日誌記錄

林志Ke發表於2016-04-26

1. 使用者管理業務邏輯介面(UserManagerApplogic.Java )

Java程式碼  收藏程式碼
  1. package com.iteye.applogic;  
  2.   
  3. public interface UserManagerApplogic {  
  4.     public void addUser(String name);  
  5. }  

 

2. 使用者管理業務邏輯實現類(UserManagerApplogicImpl.java)

Java程式碼  收藏程式碼
  1. package com.iteye.applogic.impl;  
  2.   
  3. import org.springframework.stereotype.Component;  
  4.   
  5. import com.iteye.applogic.UserManagerApplogic;  
  6. import com.iteye.annotation.BussAnnotation;  
  7. @Component("userManager")   
  8. public class UserManagerApplogicImpl implements UserManagerApplogic {  
  9.   
  10.     @BussAnnotation(moduleName="人員管理",option="新增使用者")  
  11.     public void addUser(String name) {  
  12.         System.out.println("add a User!Name is "+name);  
  13.     }  
  14. }  
 

3.業務註釋類(BusAnnotation.java)

Java程式碼  收藏程式碼
  1. package com.iteye.annotation;  
  2.    
  3. import java.lang.annotation.ElementType;  
  4. import java.lang.annotation.Retention;  
  5. import java.lang.annotation.RetentionPolicy;  
  6. import java.lang.annotation.Target;  
  7.   
  8. @Retention(RetentionPolicy.RUNTIME)  
  9. @Target({ElementType.METHOD})  
  10. public @interface BussAnnotation {  
  11.     //模組名  
  12.     String moduleName();  
  13.     //操作內容  
  14.     String option();  
  15. }  

 

(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)

Java程式碼  收藏程式碼
  1. package com.iteye.aop;  
  2.   
  3. import org.aspectj.lang.ProceedingJoinPoint;  
  4. import org.aspectj.lang.annotation.Around;  
  5. import org.aspectj.lang.annotation.Aspect;  
  6. import org.aspectj.lang.annotation.Pointcut;  
  7. import org.springframework.stereotype.Component;  
  8.   
  9. import com.iteye.annotation.BussAnnotation;  
  10.   
  11. @Aspect  
  12. @Component  
  13. public class LogInterceptor {  
  14.   
  15.     @Pointcut("execution(public * com.iteye..*.addUser(..))")  
  16.     public void aApplogic() {}  
  17.   
  18.     @Around(value = "aApplogic() && @annotation(annotation) &&args(object,..) ", argNames = "annotation,object")  
  19.     public Object interceptorApplogic(ProceedingJoinPoint pj,  
  20.             BussAnnotation annotation, Object object) throws Throwable {  
  21.         System.out.println("moduleName:"+annotation.moduleName());  
  22.         System.out.println("option:"+annotation.option());  
  23.         pj.proceed();  
  24.         return object;  
  25.     }  
  26. }  

 

5.配置檔案(applicationContext-aop.xml)

Xml程式碼  收藏程式碼
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.        xmlns:context="http://www.springframework.org/schema/context"  
  5.        xmlns:aop="http://www.springframework.org/schema/aop"  
  6.        xsi:schemaLocation="http://www.springframework.org/schema/beans  
  7.            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  8.            http://www.springframework.org/schema/context  
  9.            http://www.springframework.org/schema/context/spring-context-2.5.xsd  
  10.            http://www.springframework.org/schema/aop  
  11.            http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">  
  12.     <context:annotation-config />  
  13.     <context:component-scan base-package="com.iteye"/>  
  14.     <aop:aspectj-autoproxy />  
  15. </beans>  

 

6.測試類( test.java (Junit) )

Java程式碼  收藏程式碼
  1. import org.junit.Test;  
  2. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  3. import com.iteye.applogic.UserManagerApplogic;  
  4.   
  5. public class test {  
  6.     @Test  
  7.     public void test1()  
  8.     {  
  9.         ClassPathXmlApplicationContext ctx =   
  10.                 new ClassPathXmlApplicationContext("applicationContext-aop.xml");  
  11.         UserManagerApplogic userManager = (UserManagerApplogic) ctx.getBean("userManager");  
  12.         userManager.addUser("-li.bb-");  
  13.         ctx.destroy();  
  14.     }  
  15. }  

相關文章