How to add Properties to an Application Context

后端 未结 4 1790
感情败类
感情败类 2020-12-15 20:18

I have a Standalone Application, this application calculates a value (Property) and then starts a Spring Context. My question is how can I add that calculated property to th

相关标签:
4条回答
  • 2020-12-15 20:52

    In Spring 3.1 you can implement your own PropertySource, see: Spring 3.1 M1: Unified Property Management.

    First, create your own PropertySource implementation:

    private static class CustomPropertySource extends PropertySource<String> {
    
        public CustomPropertySource() {super("custom");}
    
        @Override
        public String getProperty(String name) {
            if (name.equals("myCalculatedProperty")) {
                return magicFunction();  //you might cache it at will
            }
            return null;
        }
    }
    

    Now add this PropertySource before refreshing the application context:

    AbstractApplicationContext appContext =
        new ClassPathXmlApplicationContext(
            new String[] {"applicationContext.xml"}, false
        );
    appContext.getEnvironment().getPropertySources().addLast(
       new CustomPropertySource()
    );
    appContext.refresh();
    

    From now on you can reference your new property in Spring:

    <context:property-placeholder/>
    
    <bean class="com.example.Process">
        <constructor-arg value="${myCalculatedProperty}"/>
    </bean>
    

    Also works with annotations (remember to add <context:annotation-config/>):

    @Value("${myCalculatedProperty}")
    private String magic;
    
    @PostConstruct
    public void init() {
        System.out.println("Magic: " + magic);
    }
    
    0 讨论(0)
  • 2020-12-15 20:52

    If You are controlling the creation of ApplicationContext as in Your example than You can always add a BeanRegistryPostProcessor to add a second PropertyPlaceholderConfigurer into the context. It should have ignoreUnresolvablePlaceholders="true" and order="1" and resolve only the custom calculated properties using the Properties object. All other properties should be resolved by the PropertyPlaceholderConfigurer from the XML that should have order="2".

    0 讨论(0)
  • 2020-12-15 21:05

    Your myCalculatedProperty must be contained within one of your properties file (which are injected by the Spring propertyPlaceholderConfigurer).

    EDIT : simply use the setter, something like this

    public static void main(final String[] args) {
        String myCalculatedProperty = magicFunction();         
        AbstractApplicationContext appContext =
              new ClassPathXmlApplicationContext("applicationContext.xml");
    
        Process p = appContext.getBean(Process.class);
        p.setMyCalculatedProperty(myCalculatedProperty);
        p.start();
    }
    
    0 讨论(0)
  • 2020-12-15 21:08

    You can add the calculated value to the system properties:

    System.setProperty("placeHolderName", myCalculatedProperty);
    
    0 讨论(0)
提交回复
热议问题