自定义日志打成jar包引入项目后不生效

发布于:2024-11-03 ⋅ 阅读:(39) ⋅ 点赞:(0)

背景:写了一个请求响应日志包,打包后在另一个项目使用pom引入后不生效

package com.example.qqllog.aspect;

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration
@EnableAspectJAutoProxy
public class RequestLogAutoConfiguration {
    public RequestLogAutoConfiguration() {
    }

    @Bean
    @ConditionalOnMissingBean({RequestLogAspect.class})
    public RequestLogAspect requestLogAspect() {
        return new RequestLogAspect();
    }
}
package com.example.qqllog.aspect;

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 SysLog {
    String value() default "";
}
package com.example.qqllog.aspect;

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration
@EnableAspectJAutoProxy
public class RequestLogAutoConfiguration {
    public RequestLogAutoConfiguration() {
    }

    @Bean
    @ConditionalOnMissingBean({RequestLogAspect.class})
    public RequestLogAspect requestLogAspect() {
        return new RequestLogAspect();
    }
}

在需要输出日志的方法上增加@SysLog注解,发现没有打印日志

原因:

默认情况下,@ComponentScan注解会扫描当前包及其所有子包中的组件。而 @SpringBootApplication 注解包含了@ComponentScan,所以 Spring Boot 框架会自动扫描 Spring Boot启动类当前包及其所有子包中的组件类。而我们的组件在jar包中不在自动扫描范围内,所以无效。

解决:

  • 在资源目录下新建目录 META-INF
  • 在 META-INF 目录下新建文件 spring.factories
  • 在文件中添加下面配置
  • org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.qqllog.aspect.RequestLogAutoConfiguration