1、编写一个注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LoggerManage {
//表示的是定义了一个变量 这个变量的类型是 String 默认是空
public String logDescription() default "";
}
2、编写切面类
@Aspect
@Component
public class LoggerAdvice {
private Logger logger = Logger.getLogger(this.getClass());
//这句话表示的意思是:所有方法如果具有@LoggingManager注解的都会被选中
@Before("@annotation(loggerManage)")
public void addBeforeLogger(JoinPoint joinPoint, LoggerManage loggerManage) {
System.out.println("我执行了哈....");
LocalDateTime now = LocalDateTime.now();
// logger.info(now.toString()+"执行[" + loggerManage.logDescription() + "]开始");
System.out.println(now.toString()+"执行[" + loggerManage.logDescription() + "]开始");
// logger.info(joinPoint.getSignature().toString());
//
// logger.info(parseParames(joinPoint.getArgs()));
}
@AfterReturning("@annotation(loggerManage)")
public void addAfterReturningLogger(JoinPoint joinPoint, LoggerManage loggerManage) {
LocalDateTime now = LocalDateTime.now();
System.out.println(now.toString()+"执行 [" + loggerManage.logDescription() + "] 结束");
}
@AfterThrowing(pointcut = "@annotation(loggerManage)", throwing = "ex")
public void addAfterThrowingLogger(JoinPoint joinPoint, LoggerManage loggerManage, Exception ex) {
LocalDateTime now = LocalDateTime.now();
System.out.println(now.toString()+"执行 [" + loggerManage.logDescription() + "] 异常");
}
private String parseParames(Object[] parames) {
if (null == parames || parames.length <= 0) {
return "";
}
StringBuffer param = new StringBuffer("传入参数 # 个:[ ");
int i =0;
for (Object obj : parames) {
i++;
if (i==1){
param.append(obj.toString());
continue;
}
param.append(" ,").append(obj.toString());
}
return param.append(" ]").toString().replace("#",String.valueOf(i));
}
}
3、在controller中使用
@LoggerManage(logDescription="执行了添加部门")
public String addDept(Dept dept){
}
4、在SpringMVC中配置AOP的自动代理
<!--配置个AOP的自动代理-->
<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
5、在SpringMVC中开启注解扫描
<!-- 开启注解扫描 记住这个包扫描的是Controll 一般情况下不要随便去越界-->
<context:component-scan base-package="com.qf.hospital.controll"></context:component-scan>