基于spring boot排除扫描类的三种方式小结
短信预约 -IT技能 免费直播动态提醒
最近在做单测的时候,由于自己配置的spring boot容器会默认扫描很多不想被加载,网上中文的文章并不多,所以来总结一下。
默认下面描述的类都在一个包下面
第一步我们新建一个应用启动的类,一个类用来充当Configuration,为了能明显的感知到其到底有没生效,我编写如下:
@SpringBootApplication
public class Test {
public static void main(String[] args) {
new SpringApplication(Test.class).run(args);
}
}
@Configuration
public class MyConfig {
@Bean
public BeanPostProcessor beanPostProcessor() {
System.out.println("初始化了 bean BeanPostProcessor");
return new BeanPostProcessor() {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("加载了bean " + beanName);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
};
}
}
我们可以启动应用发现输出
初始化了 bean BeanPostProcessor
加载了bean org.springframework.context.event.internalEventListenerProcessor
加载了bean org.springframework.context.event.internalEventListenerFactory
加载了bean org.springframework.boot.autoconfigure.AutoConfigurationPackages
加载了bean org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration
加载了bean org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration
加载了bean objectNamingStrategy
加载了bean mbeanServer
加载了bean mbeanExporter
加载了bean org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration
加载了bean spring.info-org.springframework.boot.autoconfigure.info.ProjectInfoProperties
加载了bean org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration
加载了bean org.springframework.boot.autoconfigure.web.WebClientAutoConfiguration
说明被@Configuration 修饰的类MyConfig本身被扫描了。
方法1:用exclude指明明确要排除的类.
@SpringBootApplication
@ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {MyConfig.class})})
public class Test {
public static void main(String[] args) {
new SpringApplication(Test.class).run(args);
}
}
用ComponentScan的excludeFilters属性,可以明确排除调需要扫描的类。
但是这里存在一个问题,如果要排除的类比较多,那这里会看起来很冗余。我们可以采用第二种方式。注解排除。
方法2 : 用注解方式排除
public @interface IgnoreScan {
}
新建此注解。
在需要忽略的类上添加:
@Configuration
@IgnoreScan
public class MyConfig {
@Bean
public BeanPostProcessor beanPostProcessor() {
System.out.println("初始化了 bean BeanPostProcessor");
return new BeanPostProcessor() {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("加载了bean " + beanName);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
};
}
}
这样即可排除掉不被扫描了。
方法3 :
第三种方式实现org.springframework.core.type.filter.TypeFilter,然后也是ComponentScan去排除指定的注解。网上写的好的文章很多,这里不多说了。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341