攻城尸 2015-10-24 08:53 采纳率: 0%
浏览 1409

spring 基于aop 实现日志输出 定义在controller层无效

如题,具体详情还请各位高抬贵手猛搓下方连接(并非偷懒而是之前就在segmentfault发了问题,而且贴了代码,感觉给个地址更方便。)
segmentfault传送门

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-04 13:43
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    要使用Spring框架的AOP(面向切面编程)来实现基于控制器层的日志输出功能,你需要按照以下步骤操作:

    1. 首先确保你已经引入了必要的依赖库:
    <!-- AOP相关依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
    </dependency>
    
    1. 在你的Spring配置类中定义AOP切面和切点。
    @Configuration
    public class LoggingAspectConfig {
    
        @Bean
        public AdviceMatcher adviceMatcher() {
            return new AdviceMatcher();
        }
    
        @Bean
        public LogAdvice logAdvice(LoggingAspectConfig adviceMatcher) {
            return new LogAdvice(adviceMatcher);
        }
    }
    
    @Component
    class LogAdvice implements AroundInvokeAdvisory {
    
        private final AdviceMatcher adviceMatcher;
    
        public LogAdvice(AdviceMatcher adviceMatcher) {
            this.adviceMatcher = adviceMatcher;
        }
    
        @Override
        public Object invoke(ProceedingJoinPoint joinPoint) throws Throwable {
            // 开始记录日志
            System.out.println("Before " + joinPoint.getSignature().getName());
    
            try {
                // 执行方法
                Object result = joinPoint.proceed();
    
                // 结束记录日志
                System.out.println("After " + joinPoint.getSignature().getName());
                return result;
            } catch (Throwable e) {
                throw new RuntimeException(e.getMessage(), e);
            }
        }
    }
    
    1. 将上述配置添加到Spring配置文件中。
    @Configuration
    public class AppConfig {
    
        @Autowired
        private LoggingAspectConfig loggingAspectConfig;
    
        @Bean
        public LoggingAspect loggingAspect() {
            return new LoggingAspect(loggingAspectConfig);
        }
    }
    
    1. 最后,在你的Controller或Service层使用@Around注解标记方法,并传入LogAdvice作为参数,这样就可以在方法执行前后自动打印日志信息了。

    例如,如果你有一个名为MyController的Controller,你可以这样做:

    @Controller
    public class MyController {
    
        @RequestMapping(value = "/my-endpoint", method = RequestMethod.GET)
        @AroundInvoke
        public Object myMethod(@AroundInvokeArgs ProceedingJoinPoint pjp) throws Throwable {
            System.out.println("Starting myMethod");
            try {
                // 执行业务逻辑
                return pjp.proceed();
            } finally {
                System.out.println("Ending myMethod");
            }
        }
    }
    

    以上就是使用Spring框架基于AOP实现日志输出的基本步骤。请注意,这只是一个基本示例,实际应用可能需要根据你的具体需求进行调整。

    评论

报告相同问题?