背景:写了一个请求响应日志包,打包后在另一个项目使用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