如何在springmvc中正确使用aspectj来实现打印日志?

我想通过写自定义注解来实现打印一个方法的执行时间,使用的是老项目中的

com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

依赖,项目使用的是springmvc结构,
注解类:

package com.data.annotation;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

@Target({ElementType.METHOD})

@Retention(RetentionPolicy.RUNTIME)

public @interface LogExecTime {

String value() default ""; // 方法描述参数,默认为空

}

切面类:

package com.data.annotation.aspect;

import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.Around;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Pointcut;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.stereotype.Component;

@Aspect

@Component

public class MethodExecutionTimeAspect {

private static final Logger logger = LoggerFactory.getLogger(MethodExecutionTimeAspect.class);

@Pointcut("@annotation(com.data.annotation.LogExecTime)")

public void logPointCut() {

}

@Around("logPointCut()") // 使用@Around注解

public Object logMethodExecTime(ProceedingJoinPoint joinPoint) throws Throwable {

String methodName = joinPoint.getSignature().getName();

long startTime = System.currentTimeMillis();

Object result = joinPoint.proceed(); // 执行目标方法

long endTime = System.currentTimeMillis();

long executionTime = endTime - startTime;

logger.info("================【{}】执行时间:【{}】ms=================", methodName, executionTime);

return result; // 返回目标方法的执行结果

}

}

spring-mvc的配置文件里开启了:

<aop:aspectj-autoproxy proxy-target-class="true" />

我的测试Controller类:

import com.data.annotation.LogExecTime;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;

@RequestMapping("/myTest")

@Controller

public class TestController implements ApplicationContextAware {

private ApplicationContext applicationContext;

@Autowired

private TestService testService;

@RequestMapping("/test")

@ResponseBody

@LogExecTime

public void test(){

TestController controller = (TestController) applicationContext.getBean("testController");

controller.test2();

testService.test3();

}

@LogExecTime

public void test2(){

System.out.println("test2");

}

@Override

public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

this.applicationContext = applicationContext;

}

}

我的测试Service类:

import com.data.annotation.LogExecTime;

import org.springframework.stereotype.Service;

@Service

public class TestService {

@LogExecTime

public void test3(){

System.out.println("test3");

}

}

一开始只有test方法上的注解能够生效,后来查阅资料发现需要使用代理对象去调用test2方法才能让test2方法上的注解生效,确实成功了,可是现在我发现注入的方法test3上的注解一直没有生效,网上的教程都是主要注入了testService调用注解就能正常生效,我又怀疑是不是没有注入成功导致的?可是没有注入成功代码应该是跑都跑不起来的?有没有大神给点思路或者说给出调用service里方法上注解生效的其他方法?

以上是 如何在springmvc中正确使用aspectj来实现打印日志? 的全部内容, 来源链接: utcz.com/p/945331.html

回到顶部