做用: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级别输出