当前位置: 首页 > 知识库问答 >
问题:

使用运行时参数创建单例bean

万修为
2023-03-14

我是Spring框架的新手,找不到实现以下内容的方法:

我正在使用一个类,它的属性都是私有的,没有设置器(使用该类对象的预期方式是用构造函数设置一次属性)-我将它称为首选项。我还有几个类,每个类都有相同的首选项实例作为属性。首选项旨在包含某些属性,其中一些只能在运行时解析(例如由用户提供)。

<bean id="preferenes" class="Preferences" scope="singleton">
    <constructor-arg index="0" value="defaultAttrOne" />
    <constructor-arg index="1" value="defaultAttrTwo" />
    <constructor-arg index="2" value="defaultAttrThree" />
</bean>

<bean id="someOtherBean" class="SomeOtherClass" scope="singleton">
    <constructor-arg index="0" ref="preferences" />
</bean>

共有1个答案

靳富
2023-03-14

这几乎是Spring在默认情况下为您所做的事情,所以您不必做任何特殊的事情:如果您创建了单个bean引用(称为preferences),您就可以像您所期望的那样将其注入到任何其他bean中。

关于具有默认值的属性,有几种方法可以实现:

如果需要,可以保留纯基于XML的配置,并使用默认值配置PropertyPlaceHolderConfigurer。类似于:

<bean class="org.s.beans.factory.config.PropertyPlaceholderConfigurer">      
    <property name="location" value="prefrences.properties"/>
</bean>

<bean id="preferenes" class="Preferences" scope="singleton">
   <constructor-arg index="0" value="$[preferences.one:12]" />
   <constructor-arg index="1" value="$[preferences.two:AUTO]" />
   <constructor-arg index="2" value="$[preferences.three:false]" />
</bean>
prefrences.three=true
<bean id="preferences" class="org.myproject.PreferencesFactoryBean"/>

您也可以使用java配置方式,但作为初学者,这可能会有一些变化。然而,java配置非常强大和灵活,所以您可能想尝试一下。

@Configuration
@PropertySource("classpath:preferences.properties")
public class AppConfig {

    @Value("${preferences.one}")
    private int preferenceOne = 12;

    @Value("${preferences.two}")
    private MyEnum preferenceTwo = MyEnum.AUTO;

    @Value("${preferences.three}")
    private boolean preferenceThree;

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }

    @Bean
    public Preferences preferences() {
        return new Preferences(preferenceOne, preferenceTwo, preferenceThree);
    }

}
 类似资料:
  • 问题内容: 使用Spring的Java Config,我需要使用只能在运行时获得的构造函数参数来获取/实例化作用域原型的bean。考虑以下代码示例(为简便起见,已简化): Thing类的定义如下: 注意事项name是final:它只能通过构造函数来提供,并保证不变性。其他依赖关系是Thing类的特定于实现的依赖关系,不应知道(紧密耦合到)请求处理程序实现。 这段代码与Spring XML配置完美配

  • 作为大多数Spring Boot新用户,我对@Autow的问题:D 我已经在这里阅读了大量有关此注释的主题,但仍然无法找到解决问题的正确方法。 假设我们有这个Spring Boot层次结构: 类,我们希望在每次调用时实例化它: Out get controller,它会在每个请求中创建新的SomeRepo对象: 最后,使用@Autowired创建TestWire实例的类: 假设我们多次向“/”发出

  • 本文向大家介绍JavaScript 使用rest参数创建参数数组,包括了JavaScript 使用rest参数创建参数数组的使用技巧和注意事项,需要的朋友参考一下 示例 如果您需要一个数组,其中包含您可能会或可能不会希望拥有的额外参数,除了您明确声明的参数外,还可以在参数声明内使用array rest参数,如下所示: 示例1,数组中的可选参数: 示例2,所有参数现在都是一个数组: 控制台输出tru

  • 问题内容: (对我来说)有点危险。基本上,我想有两个从同一个类继承的不同单例。在任何一种情况下,我都想使用某个本身派生的类。所以我既有又有。和被用作使用在其胃和分别。我在所有领域都失败了。上一次尝试是工厂模式,该模式只是将Swift 1.2引入了Segfault: 如前所述,我还尝试使以下模式通用: (这不是您所看到的通用方法。但是我的所有尝试都失败了,因此我展示了我的出发点。) 无论如何,我似乎

  • 使用spring的Java配置,我需要获取/实例化一个具有构造函数参数的原型范围的bean,这些参数只能在运行时获得。请考虑以下代码示例(为简洁起见进行了简化): 其中Thing类定义如下: 注意是:它只能通过构造函数提供,并保证不变性。其他依赖项是类的特定于实现的依赖项,不应该知道(紧密耦合到)请求处理程序实现。 这段代码与spring XML配置非常适用,例如: 如何使用Java配置实现相同的