做用:java
1.生成文檔。這是最多見的,也是java 最先提供的註解。經常使用的有 @see @param @return 等
2..跟蹤代碼依賴性,實現替代配置文件功能。比較常見的是spring 2.5 開始的基於註解配置。做用就是減小配置。如今的框架基本都使用了這種配置來減小配置文件的數量。
3.在編譯時進行格式檢查。如@override 放在方法前,若是你這個方法並非覆蓋了超類方法,則編譯時就能檢查出。spring
經常使用的元註解:apache
@Retention: 只能用於修飾一個Annotation定義,用於指定該Annotation做用範圍,或則生命週期?app
參數值 | 賦值後的做用 |
---|---|
RetentionPolicy.CLASS | (默認值)給解析器使用的。編譯器會把註解記錄在class文件中,當運行java程序的時候,JVM不會保留註解。 |
RetentionPolicy.RUNTIME | 編譯器會在註解記錄在class文件中,當運行java程序時,JVM會保留註解,程序能夠經過反射來獲取該註解。 |
RetentionPolicy.SOURCE | 給編譯器使用的。編譯器不會將註解記錄到class文件中。 |
@Target: 用於修飾類的哪一個成員。它包含了一個名爲value,類型爲ElementType的成員變量。用於指定修飾目標對象的類型:TYPE(類、接口)、FIELD(成員變量)、 METHOD(方法)框架
@Documented: 用於指定被@Documented修飾的 Annotation 類將被 javadoc 工具提取成文檔。使用該元註解修飾,該註解的信息能夠生成到javadoc 文檔中。ide
@Inherited: 若是一個註解使用該元註解修飾,那麼某個類使用了這個註解,其子類也會自動繼承這個註解。工具
package com.savingyu.util.aop; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 日誌註解 * @author yu * */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface LoggerManage { public String description(); }
1 package com.savingyu.util.aop; 2 3 import org.apache.commons.lang3.builder.ToStringBuilder; 4 import org.aspectj.lang.JoinPoint; 5 import org.aspectj.lang.annotation.AfterReturning; 6 import org.aspectj.lang.annotation.AfterThrowing; 7 import org.aspectj.lang.annotation.Aspect; 8 import org.aspectj.lang.annotation.Before; 9 import org.slf4j.Logger; 10 import org.slf4j.LoggerFactory; 11 import org.springframework.stereotype.Service; 12 13 /** 14 * 日誌管理: 15 * @author Administrator 16 * 17 */ 18 @Aspect 19 @Service 20 public class LoggerAdvice { 21 protected Logger logger = LoggerFactory.getLogger(this.getClass()); 22 23 @Before("within(com.savingyu..*) && @annotation(loggerManage)") 24 public void addBefoLogger(JoinPoint joinPoint,LoggerManage loggerManage){ 25 logger.info("######################################################"); 26 logger.info("執行"+loggerManage.description()+"開始"); 27 logger.info(joinPoint.getSignature().toString()); 28 logger.info(parseParames(joinPoint.getArgs())); 29 logger.info("######################################################"); 30 } 31 32 @AfterReturning("within(com.savingyu..*) && @annotation(loggerManage)") 33 public void addAfterRetruningLogger(JoinPoint joinPoint,LoggerManage loggerManage){ 34 logger.info("執行"+loggerManage.description()+" 結束"); 35 } 36 37 @AfterThrowing(pointcut = "within(com.savingyu..*) && @annotation(loggerManage)", 38 throwing ="ex") 39 public void addAfterThrowingLogger(JoinPoint joinPoint,LoggerManage loggerManage, 40 Exception ex){ 41 logger.error("執行"+loggerManage.description()+" 異常",ex); 42 } 43 44 private String parseParames(Object[] parames){ 45 if(null == parames || parames.length <= 0 || parames.length>1024){ 46 return ""; 47 } 48 StringBuffer param = new StringBuffer("傳入參數[{}] "); 49 for(Object obj : parames){ 50 param.append(ToStringBuilder.reflectionToString(obj)).append(" "); 51 } 52 return param.toString(); 53 } 54 }
2018-08-21 14:34:19.788 INFO 6384 --- [ restartedMain] o.s.j.e.a.AnnotationMBeanExporter : Unregistering JMX-exposed beans on shutdown
在application.properties中ui
說明:this
1日誌文件在10Mb大小時,產生新的日誌文件。spa
2級別
logging.level.com.didispace=DEBUG
:com.didispace
包下全部class以DEBUG級別輸出
logging.level.root=WARN
:root日誌以WARN級別輸出