打印的日志,一律用System.out.println来模拟。
步骤:
1.自定义注解,(不是必须的,但是,自定义注解能为打印日志提供更多详细信息)
2.配置日志切面
3.配置aop的xml
4.在相关Controller上附上自定义注解。
pom,只贴出了部分
<!--aop-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.11</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.11</version>
</dependency>
<!--aop-->
1.自定义注解。
以前,都只知道用注解,从来都没自己定义过,也没想过它是怎么起作用的,今天自己弄了一遍,感觉注解原来是这么回事,真的挺强大的!
注解是如何起作用的:扫描,springmvc中有个<context:component-scan .../>的标签,用来扫描注解,
我的理解是这样的,比如,它在这个类上扫描到了一个Controller,它就为这个类执行Controller相关的代码,从而在我们看来加上一个@Controller,就有了Controller相关的功能,----我的个人理解。
注解里的属性也挺强大的,我们给属性赋值,从而执行相应的功能或标记信息。
@Target 注解作用的目标,用在什么上 TYPE.接口类,枚举,注解 METHOD 方法 等等。。。
@Retention RUNTIME 在运行时可以通过反射获取到,,
这里,我随便简单写了一个,
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface OpenLog {
String openType() default "";==>自定义属性有什么用,在这,比如:我把这个注解用在相应的@Controller上,然后这样写:@OpenLog(openType="登录").在打印日志的时候,获取这个Controller上的这个注解属性的值,从而,我就知道是在执行登录操作,等等。。。
}
2.定义日志切面
package aop;
import jtool.OpenLog;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
/**
* @author :JXH
* @time :2019-02-20-下午7:37
* 记录日志切面
*/
@Aspect
@Component
public class LogInterceptor {
//1.拦截那些方法,用环绕通知的话,可以获取方法的返回值,更为强大!
@Pointcut("execution(* controller..*.*(..))")
public void pointCut(){}
@Before("pointCut()")
public void before(JoinPoint joinPoint){
// 获取方法上的注解
// Signature signature= joinPoint.getSignature();
// MethodSignature methodSignature=(MethodSignature) signature;
// OpenLog openLog= methodSignature.getMethod().getAnnotation(OpenLog.class);
// 获取类上的注解
OpenLog openLog=joinPoint.getTarget().getClass().getAnnotation(OpenLog.class);
System.out.println("执行方法:"+joinPoint.getSignature().getName()+
" 所属类:"+joinPoint.getSignature().getDeclaringTypeName());
System.out.println("开始时间:"+System.currentTimeMillis());
System.out.println("OpenLog参数:"+openLog.openType());
Object[] params=joinPoint.getArgs();//获取参数!
for (Object o:params){
System.out.println("请求参数:"+o);
}
}
@After("pointCut()")
public void after(JoinPoint joinPoint){
System.out.println("结束时间:"+System.currentTimeMillis());
}
//其他想要可自己实现。
}
3.配置文件 springmvc-servlet.xml.
<!--aop-->
<!--扫描注解和切面-->
<context:component-scan base-package="aop,jtool"/>
我不知道下面这个有什么用
<aop:aspectj-autoproxy proxy-target-class="true"/>
<!--aop-->
4.在Controller上添加自定义的注解
在这我的意思,表示进了这个Controller
@OpenLog(openType = "formController")
@Controller
public class formcontroller {
。。。。。
}
@OpenLog(openType = "viewController")
@Controller
public class viewResolverController {
......
}
......
打印日志: