Jimmy小站
小明也有大梦想 — 蒋明/铭根据自定义的注解,将spring容器中的Bean定义换一个名字(注:前提是这个Bean定义已经存在)
2022-02-09 / 未分类 / 6837 次围观 / 20 次吐槽方式一 遍历所有Beanname 检查是否有指定注解
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
String[] beanDefinitionNames = registry.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
BeanDefinition beanDefinition = registry.getBeanDefinition(beanDefinitionName);
if (!(beanDefinition instanceof AnnotatedBeanDefinition)) {
continue;
}
AnnotatedBeanDefinition annotatedBeanDefinition = (AnnotatedBeanDefinition) beanDefinition;
AnnotationMetadata annotationMetadata = annotatedBeanDefinition.getMetadata();
Map<String, Object> annotationAttributes = annotationMetadata.getAnnotationAttributes(GPServiceImpl.class.getName());
}
}
方式二 通过enviroment过滤指定注解
(缺点,需要知道具体的包路径,如果是提供二方包给第三方使用,不能明确知道第三方的包路径,所以不推荐)
@Slf4j
@Component
public class DemoSpringContext2 implements BeanDefinitionRegistryPostProcessor, ResourceLoaderAware, EnvironmentAware {
private Environment environment;
private ResourceLoader resourceLoader;
@Value("${project.name}")
String projectName;
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(registry, false, environment, resourceLoader);
scanner.addIncludeFilter(new AnnotationTypeFilter(GPServiceImpl.class));
// 扫描的包路径
Set<BeanDefinition> candidateComponents = scanner.findCandidateComponents("xxx.general.platform.core");
try {
registerCandidateComponents(registry,candidateComponents);
} catch (ClassNotFoundException e) {
log.error("postProcessBeanDefinitionRegistry error");
}
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("beanFactory = " + beanFactory);
}
@Override
public void setEnvironment(Environment environment) {
this.environment = environment;
}
@Override
public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
}
/**
* 注册 BeanDefinition
*/
private void registerCandidateComponents(BeanDefinitionRegistry registry, Set<BeanDefinition> candidateComponents) throws ClassNotFoundException {
for (BeanDefinition candidateComponent : candidateComponents) {
if (candidateComponent instanceof AnnotatedBeanDefinition) {
AnnotatedBeanDefinition annotatedBeanDefinition = (AnnotatedBeanDefinition) candidateComponent;
AnnotationMetadata annotationMetadata = annotatedBeanDefinition.getMetadata();
Map<String, Object> map2 = Optional.ofNullable(annotationMetadata.getAnnotationAttributes(GPServiceImpl.class.getName()))
.orElse(new HashMap<>());
String spiCode = String.valueOf(map2.get("spiCode"));
String bundleId = String.valueOf(map2.get("bundleId"));
String finalBundleId = StringUtils.isNotBlank(bundleId) ? bundleId : "jimmy";
String implVersion = Joiner.on("#").skipNulls().join(spiCode, finalBundleId);
registry.registerBeanDefinition(implVersion, candidateComponent);
}
}
}
}
推荐您阅读更多有关于“”的文章
本站所有文章如无特别注明均为原创。作者:吉米酱 ,复制或转载请以超链接形式注明转自 Jimmy小站 。
原文地址《根据自定义的注解,将spring容器中的Bean定义换一个名字(注:前提是这个Bean定义已经存在)》
原文地址《根据自定义的注解,将spring容器中的Bean定义换一个名字(注:前提是这个Bean定义已经存在)》
- 上一篇:spring 可以指定配置默认值
- 下一篇:java 远程debug和热部署
本月热文
Copyright © Jimmy小站 Allrights Reserved.备案号:桂ICP备 15005996
已有20位网友发表了看法:
发表评论