首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何让Spring在应用运行时再次检查ConditionalOnBean?

如何让Spring在应用运行时再次检查ConditionalOnBean?
EN

Stack Overflow用户
提问于 2022-07-14 08:09:28
回答 1查看 93关注 0票数 0

在某些bean上,我使用ConditionalOnBean (示例中的ab )。在应用程序启动时,以它为条件的bean不存在。因此,注释(ConditionalOnBean)下的bean (示例中的ConditionalOnBean)没有初始化,也没有被Spring处理。在运行应用程序的过程中,bean被动态地添加到上下文中(参见示例中的addYoni )。为了初始化现在传递条件的bean(示例中是ab ),我需要告诉Spring再次检查所有条件。应该指出的是,在现实世界中,我不知道哪些类处于相关的条件下(事实上,其中一些类还没有编写)。

如果有可能的话,如何才能做到呢?

代码语言:javascript
运行
复制
@ConditionalOnBean(name = "yoni")
@Service
public class a {
.
.
.
}

@ConditionalOnBean(name = "yoni")
@Service
public class b {
.
.
.
}

@Service
public class d {
    @Autowired
    private ApplicationContext applicationContext;

    public void addYoni(){
        ConfigurableApplicationContext configContext = (ConfigurableApplicationContext) applicationContext;
        DefaultListableBeanFactory beanRegistry = (DefaultListableBeanFactory) configContext.getBeanFactory();
        beanRegistry.registerSingleton("yoni", yoni());
        
        // What Should be written here to cause Spring to check and to inject the under-conditions classes into the application context?
    }
    
    public Rab yoni() {
        Rab rab = new rab();
        .
        .
        .        
        return rab;  
    } 
}
EN

回答 1

Stack Overflow用户

发布于 2022-07-15 10:03:48

最后,我找到了一种方法。它需要使用注释ConditionalOnBean查找类并从它们创建bean。下面是代码(问题中的类d ):

代码语言:javascript
运行
复制
@Service
public class d {
    @Autowired
    private ApplicationContext applicationContext;


    public void addC(){
        ConfigurableApplicationContext configContext = (ConfigurableApplicationContext) applicationContext;
        DefaultListableBeanFactory beanRegistry = (DefaultListableBeanFactory) configContext.getBeanFactory();
        beanRegistry.registerSingleton("yoni", yoni());

        ClassPathScanningCandidateComponentProvider componentProvider =
                new ClassPathScanningCandidateComponentProvider(false);
        componentProvider.addIncludeFilter(new AnnotationTypeFilter(ConditionalOnBean.class));
        Set<BeanDefinition> candidateComponents = componentProvider.findCandidateComponents("base.project.package");
        candidateComponents.forEach(beanDefinition -> {
            String className = beanDefinition.getBeanClassName().substring(beanDefinition.getBeanClassName().lastIndexOf('.') + 1);
            String beanName = Character.toLowerCase(className.charAt(0)) + className.substring(1);
            if (!applicationContext.containsBean(beanName))
            {
                Map<String, Object> annotationAttributes = ((ScannedGenericBeanDefinition) beanDefinition).getMetadata().getAnnotationAttributes(
                        ConditionalOnBean.class.getName());
                String[] beansDependsOn = (String[]) annotationAttributes.getOrDefault("name", new String[]{});
                if ((beansDependsOn.length == 1) && (beansDependsOn[0].contentEquals("yoni")) {
                    try {
                        beanRegistry.createBean(Class.forName(beanDefinition.getBeanClassName()));
                    } catch (ClassNotFoundException e) {
                        log.error("Failed to init the class : [" + beanDefinition.getBeanClassName() + "]\n", e);
                        throw new RuntimeException(e);
                    }
                }

            }
        });
    }

    public Rab yoni() {
        Rab rab = new rab();

        return rab;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72977235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档