Python 官方文档:入门教程 => 点击学习
目录将类从@ComponentScan中排除问题描述方案一方案二方案三方案四@ComponentScan 详解将类从@ComponentScan中排除 问题描述 最近在学习Sprin
最近在学习SpringCloud的Ribbon,在使用
为服务指定负载均衡策略的时候,根据Ribbon官方文档介绍,自定义的Ribbon配置类不允许被SpringBoot的**@ComponentScan**注解扫描到,所以需要将自定义的配置类RibbonConfig从在Springboot自动注入的范围内排除
我们都知道,Springboot的**@SpringBootApplication**会自动扫描本类所在包下的所有类和子类,所以只需要将RibbonConfig定义在Springboot启动类所在包外面即可
通过在启动类中添加
@ComponentScan(excludeFilters = @ComponentScan.Filter(
type = FilterType.ASSIGNABLE_TYPE,
classes = RibbonConfig.class))
通过FilterType.ASSIGNABLE_TYPE来指定要排除的类
如果需要排除的类太多了这个就很麻烦
通过自定义注解实现
@ComponentScan(excludeFilters = @ComponentScan.Filter(
type = FilterType.ANNOTATION,
classes = ScanIgnore.class))
与方案二不同的是,这里用的是FilterType.ANNOTATION
通过实现TypeFilter类来自定义过滤器
@ComponentScan(excludeFilters = {
@Filter(
type = FilterType.CUSTOM,
classes = TypeExcludeFilter.class),
@Filter(
type = FilterType.CUSTOM,
classes = AutoConfigurationExcludeFilter.class) })
此处给出的就是**@SpringbootApplication中的实现方式,通过FilterType.CUSTOM**来根据自动一过滤器来排除bean
最后贴出枚举类FilterType:
package org.springframework.context.annotation;
public enum FilterType {
ANNOTATION,
ASSIGNABLE_TYPE,
ASPECTJ,
REGEX,
CUSTOM
}
@ComponentScan 的作用就是根据定义的扫描路径,把符合扫描规则的类装配到spring容器中,注解定义如下。
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
@AliasFor("basePackages")
String[] value() default {};
@AliasFor("value")
String[] basePackages() default {};
Class<?>[] basePackageClasses() default {};
Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;
Class<? extends ScopeMetadataResolver> scopeResolver() default AnnotationScopeMetadataResolver.class;
ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT;
String resourcePattern() default "**
public class MyTypeFilter implements TypeFilter {
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
String className = metadataReader.getClaSSMetadata().getClassName();
if(className.contains("Controller")){
return true;
}
return false;
}
}
修改配置类
@Configuration
@ComponentScan(value = "com.xhx.spring",
useDefaultFilters = false,
includeFilters = {
@ComponentScan.Filter(type = FilterType.CUSTOM,classes = {MyTypeFilter.class})
}
)
public class MyConfig {
}
输出结果:
输出spring容器中的bean的测试类:只过滤输出了名字中含有hello的类。
package com.xhx.spring.componentscan;
import com.xhx.spring.componentscan.config.MyConfig;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@RunWith(SpringRunner.class)
@SpringBootTest
public class ComponentScanApplicationTests {
@Test
public void testLoads() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
List<String> hello = Arrays.stream(context.getBeanDefinitionNames()).collect(Collectors.toList());
hello.stream().filter(name->name.contains("hello")).peek(System.out::println).count();
}
}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。
--结束END--
本文标题: Springboot项目实现将类从@ComponentScan中排除
本文链接: https://lsjlt.com/news/156508.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0