通过@Configuration注解标识的类默认都会被spring加载,但是我们有时候想要通过开关来决定要不要加载,这个时候就需要该博客讲解的内容。
我目前了解的两种实现方式如下
我常用的例如:@EnableCaching(缓存)、@EnableScheduling(定时任务),@EnableJpaAuditing(审计),这类注解就像开关一样,只要在SpringBoot启动类上加这类注解,就能开启相关的功能。
本文以日志打印的功能为基础,实现此功能
public class LogFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException { }
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("记录请求日志");
chain.doFilter(request, response);
System.out.println("记录响应日志");
}
@Override
public void destroy() { }
}
注意,这里用了@ConditionalOnWebApplication注解,没有直接使用@Configuration注解。
@ConditionalOnWebApplication
public class LogFilterWebConfig {
@Bean
public LogFilter buildFilter() {
return new LogFilter();
}
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(LogFilterWebConfig.class)
public @interface EnableLog {
}
@SpringBootApplication
@EnableLog
public class ConfigSwitchApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigSwitchApplication.class, args);
}
}
添加一个测试的接口
@RestController
public class TestController {
@GetMapping("/test")
public String test() {
System.out.println("test接口被调用");
return "test";
}
}
启动项目,然后访问http://localhost:8020/test
可以看到控制台已经实现了打印log的功能,我们把@EnableLog注释掉再启动测试一下
可以看到日志信息并没有被打印,代表着LogFilterWebConfig这个类没有被spring加载。
使用@ConditionalOnProperty注解指定配置项实现
@ConditionalOnProperty(name = "mylog.enable", havingValue = "true")
@Configuration
public class LogFilterWebConfig {
@Bean
public LogFilter buildFilter() {
return new LogFilter();
}
}
mylog:
enable: true
到此该博客的任务已经完成,是不是配置起来很简单呢,感兴趣的小伙伴可以自己试试。
github地址
创作不易,要是觉得我写的对你有点帮助的话,麻烦在github上帮我点下 Star
【SpringBoot框架篇】其它文章如下,后续会继续更新。