相关疑难解决方法(0)

我可以在运行时替换Spring bean定义吗?

请考虑以下情形.我有一个带有bean的Spring应用程序上下文,其属性应该是可配置的,思考DataSourceMailSender.可变应用程序配置由一个单独的bean管理,让我们调用它configuration.

管理员现在可以更改配置值,如电子邮件地址或数据库URL,我想在运行时重新初始化配置的bean.

假设我不能简单地修改上面的可配置bean的属性(例如由FactoryBean或者构造函数注入创建),但必须重新创建bean本身.

有关如何实现这一点的任何想法?我很高兴收到有关如何组织整个配置的建议.没有什么是固定的.:-)

编辑

为了澄清一点:我不是问如何更新配置或如何注入静态配置值.我会尝试一个例子:

<beans>
    <util:map id="configuration">
        <!-- initial configuration -->
    </util:map>

    <bean id="constructorInjectedBean" class="Foo">
        <constructor-arg value="#{configuration['foobar']}" />
    </bean>

    <bean id="configurationService" class="ConfigurationService">
        <property name="configuration" ref="configuration" />
    </bean>
</beans>
Run Code Online (Sandbox Code Playgroud)

所以有一个constructorInjectedBean使用构造函数注入的bean .想象一下,bean的构造非常昂贵,因此使用原型范围或工厂代理不是一种选择DataSource.

我想要做的是每次更新配置时(通过configurationServicebean constructorInjectedBean重新创建并重新注入应用程序上下文和依赖bean).

我们可以放心地假设constructorInjectedBean正在使用接口,因此代理魔术确实是一种选择.

我希望能让这个问题更清楚一些.

java spring

68
推荐指数
3
解决办法
5万
查看次数

在Spring中运行时动态声明bean

我想知道以下是否可行.出于测试目的,我希望在应用程序上下文中为不同的测试声明不同的模拟类.这些是使用Jersey REST客户端的验收测试.有没有办法在运行时动态声明bean?Spring是否有一个API允许在加载上下文后更改应用程序上下文?

spring

18
推荐指数
1
解决办法
3万
查看次数

在运行时延迟初始化 spring 安全性 + 重新加载 spring 安全性配置

Spring 通常在启动应用程序时急切地加载 Spring 安全配置。我在 Spring Security 中使用 OAuth

我正在维护一个用于存储 SSO 相关值(如 jwk-url、client_id、client_secret)的配置表。该值将由管理员用户通过 CRUD 在同一个 Spring Boot 应用程序中填充。

那么只有 jwk-url 可以在 Spring 安全配置中进行配置(refer below code - jwkSetUri(...))。这在应用程序启动时不可用。

所以我想在将值加载到表中后初始化 spring 安全配置,就像运行时的​​延迟加载(@Lazy)一样。我知道如何延迟加载常规类/服务。

  1. 但是我仍然不确定如何configure(HttpSecurity http)在运行时调用该方法以及如何传递 HttpSecurity 参数。当我在运行时尝试像延迟加载一样调用new ResourceServerConfiguration()时,我没有看到 configure() 方法被调用。(或者)这个类需要在需要时作为 bean 和延迟加载来维护。但仍然不确定如何在代码中调用 configure()。

  2. 另一件事是如何在运行时刷新/重新加载 spring 安全配置,如果管理员更改了 JWK url。那么只有 spring 安全配置才能使更改生效。

@Configuration
@EnableWebSecurity
public class ResourceServerConfiguration extends WebSecurityConfigurerAdapter {
    
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.cors()
                .and()
                .csrf().disable()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
                .authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .oauth2ResourceServer()
                .authenticationEntryPoint(oAuth2AuthenticationEntryPoint)
                .accessDeniedHandler(oAuth2AccessDeniedHandler)
                .jwt() …
Run Code Online (Sandbox Code Playgroud)

java spring spring-security spring-boot spring-security-oauth2

7
推荐指数
1
解决办法
160
查看次数

动态改变春豆

如何使用java spring在运行时动态更改bean的属性?我有一个bean mainView,它应该用作属性"class""class1"或"class2".此决定应基于属性文件进行,其中属性"withSmartcard"为"Y"或"N".

ApplicationContext的:

<bean id="mainView"
    class="mainView">
    <property name="angebotsClient" ref="angebotsClient" />
    <property name="class" ref="class1" />
</bean>



<bean id="class1"
    class="class1">
    <constructor-arg ref="mainView" />
</bean>

<bean id="class2"
    class="class2">
    <constructor-arg ref="mainView" />
</bean>
Run Code Online (Sandbox Code Playgroud)

PropertyFile:

withSmartcard = Y

java spring javabeans

6
推荐指数
2
解决办法
1万
查看次数

动态更新spring bean。可能吗?

如果Spring Bean配置发生更改,是否可以动态更新Spring Bean?

例如,假设我有一个具有boolean属性x的spring bean,并且true当应用程序启动时spring bean具有值。

因此spring会创建属性x设置为true 的bean 。

有没有一种方法可以让我将属性更改为x(在应用程序运行时),例如,将属性更新为false

java spring

5
推荐指数
1
解决办法
5619
查看次数