如何在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







