为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Spring Boot 中动态注册 bean?

如何在 Spring Boot 中动态注册 bean?

LEATH 2023-04-13 14:53:33
我希望在运行时覆盖 Spring 的 SSLContext。因此,我试图找到将以下方法动态注册为 bean 的方法。对于前。调用 GetMapping 端点时,应将以下方法作为 bean 注入到 Spring IoC 中。public static SSLContext getSSLContext() throws Exception {    TrustManager[] trustManagers = new TrustManager[] {            new ReloadableX509TrustManager(truststoreNewPath)    };    SSLContext sslContext = SSLContext.getInstance("SSL");    sslContext.init(null, trustManagers, null);    return sslContext;}我怎样才能做到这一点?
查看完整描述

3 回答

?
手掌心

TA贡献1942条经验 获得超3个赞

Spring 5提供了Bean注册,可以动态完成。

Supplier<SSLContext> sslcontextSupplier = () -> getSSLContext();
context.registerBean("sslcontext",SSLContext.class,sslcontextSupplier);


查看完整回答
反对 回复 2023-04-13
?
SMILET

TA贡献1796条经验 获得超4个赞

您可以使用 ConfigurableBeanFactory 在运行时手动注册 bean。


@Service

public class RegisterBeansDynamically implements BeanFactoryAware {


    private ConfigurableBeanFactory beanFactory;


    public <T> void registerBean(String beanName, T bean) {

        beanFactory.registerSingleton(beanName, bean);

    }


    @Override

    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {

        this.beanFactory = (ConfigurableBeanFactory) beanFactory;

    }

}

但请记住:必须刷新您的上下文,使其他 bean 能够自动注入您的新 bean,否则它们必须从应用程序上下文动态访问它们。



查看完整回答
反对 回复 2023-04-13
?
开心每一天1111

TA贡献1836条经验 获得超12个赞

这是演示。


public class Demo implements ApplicationContextAware {


    private ApplicationContext applicationContext;


    @Override

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

        this.applicationContext = applicationContext;

        ConfigurableApplicationContext context = (ConfigurableApplicationContext)applicationContext;

        DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory)context.getBeanFactory();


        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(YourClass.class);


        beanDefinitionBuilder.addPropertyValue("property1", "propertyValue");

        beanDefinitionBuilder.addPropertyValue("property2", applicationContext.getBean(AnotherClass.class));



        beanFactory.registerBeanDefinition("yourBeanName", beanDefinitionBuilder.getBeanDefinition());



    }

}

您可以将寄存器部分移动到您的方法中(从 开始BeanDefinitionBuilder)。我想这会满足你的需求。


查看完整回答
反对 回复 2023-04-13
  • 3 回答
  • 0 关注
  • 147 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信