这篇文章给大家介绍Springboot中怎么加载自定义注解bean,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
使用场景:
添加中间件,配置某个注解的自定义扫描路径,例如:dubbo的@Service@Refrence,Seata的@Refrence。
使用自定义注解,配置自定义注解的扫描路径。
配置代码:
/**
* @author yuan
* 加载指定包路径下的自定义注解实例
*/
public class StateImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
// 不使用默认的TypeFilter
ClassPathScanningCandidateComponentProvider provider =
new ClassPathScanningCandidateComponentProvider(false);
// 添加扫描规律规则,这里指定了内置的注解过滤规则
provider.addIncludeFilter(new AnnotationTypeFilter(StateService.class));
// 获取扫描结果的全限定类名
List<String> className = new ArrayList<>();
// 扫描指定包,如果有多个包,这个过程可以执行多次
String[] packages = getPackageToScan(annotationMetadata);
for (String aPackage : packages) {
Set<BeanDefinition> beanDefinitionSet = provider.findCandidateComponents(aPackage);
beanDefinitionSet.forEach(beanDefinition -> className.add(beanDefinition.getBeanClassName()));
}
String[] classNameArray = new String[className.size()];
return className.toArray(classNameArray);
}
private String[] getPackageToScan(AnnotationMetadata metadata) {
//通过自定义注解获取自定义包路径
AnnotationAttributes attributes = AnnotationAttributes.fromMap(
metadata.getAnnotationAttributes(EnabledStateMachine.class.getName()));
String[] basePackages = attributes.getStringArray("basePackages");
if (basePackages.length != 0) {
return basePackages;
}
return new String[]{ClassUtils.getPackageName(metadata.getClassName())};
}
}
将StateImportSelector加入的注解中,以便自动注入
/**
* @author yuan
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import({StateImportSelector.class})
public @interface EnabledStateMachine {
String[] basePackages() default {};
}
关于Springboot中怎么加载自定义注解bean就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/gentlelions/blog/5048995