作用:
1.生成文檔。這是最常見的,也是java 最早提供的注解。常用的有 @see @param @return 等
2..跟蹤代碼依賴性,實現替代配置文件功能。比較常見的是spring 2.5 開始的基於注解配置。作用就是減少配置。現在的框架基本都使用了這種配置來減少配置文件的數量。
3.在編譯時進行格式檢查。如@override 放在方法前,如果你這個方法並不是覆蓋了超類方法,則編譯時就能檢查出。
常用的元注解:
@Retention: 只能用於修飾一個Annotation定義,用於指定該Annotation作用范圍,或則生命周期?
參數值 | 賦值后的作用 |
---|---|
RetentionPolicy.CLASS | (默認值)給解析器使用的。編譯器會把注解記錄在class文件中,當運行java程序的時候,JVM不會保留注解。 |
RetentionPolicy.RUNTIME | 編譯器會在注解記錄在class文件中,當運行java程序時,JVM會保留注解,程序可以通過反射來獲取該注解。 |
RetentionPolicy.SOURCE | 給編譯器使用的。編譯器不會將注解記錄到class文件中。 |
@Target: 用於修飾類的哪個成員。它包含了一個名為value,類型為ElementType的成員變量。用於指定修飾目標對象的類型:TYPE(類、接口)、FIELD(成員變量)、 METHOD(方法)
@Documented: 用於指定被@Documented修飾的 Annotation 類將被 javadoc 工具提取成文檔。使用該元注解修飾,該注解的信息可以生成到javadoc 文檔中。
@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
- 時間日期
- 日志級別:ERROR、WARM、INFO、DEBUGTorRACE
- 進程ID
- 線程名
- logger名
- 日志內容
屬性配置:
在application.properties中
- spring.output.ansi.enabled:NVER、DETECT、ALWAYS——多彩輸出:禁用、默認、總是
- logging.file:文件輸出。設置文件。可以絕對路徑、相對路徑。
- logging.path:同上。設置目錄。
- logging.level.*=level:級別控制。*為包名,leve為級別選項:Trace、debug、info、warn、error、fatal、off
說明:
1日志文件在10Mb大小時,產生新的日志文件。
2級別
logging.level.com.didispace=DEBUG
:com.didispace
包下所有class以DEBUG級別輸出
logging.level.root=WARN
:root日志以WARN級別輸出