views:

558

answers:

1

Hi,

I'm aware that the following implementation of a PropertyPlaceHolderConfigurer is possible:

public class SpringStart {
   public static void main(String[] args) throws Exception {
     PropertyPlaceholderConfigurer configurer = new PropertyPlaceholderConfigurer();
     Properties properties = new Properties();
     properties.setProperty("first.prop", "first value");
     properties.setProperty("second.prop", "second value");
     configurer.setProperties(properties);

     ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext();
     context.addBeanFactoryPostProcessor(configurer);

     context.setConfigLocation("spring-config.xml");
     context.refresh();

     TestClass testClass = (TestClass)context.getBean("testBean");
     System.out.println(testClass.getFirst());
     System.out.println(testClass.getSecond());
  }}

With this in the config file:

<?xml version="1.0" encoding="UTF-8"?>

http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

<bean id="testBean" class="com.spring.ioc.TestClass">
    <property name="first" value="${first.prop}"/>
    <property name="second" value="${second.prop}"/>
</bean>

However, this looks to me that the changes made to the testBean will be shown on all the test beans.

How do I use the propertyPlaceHolderCongfigurer in such a way that I can apply it to individual instances of the bean, and have access to each of these instances?

I hope the question makes sense. Any help would be much appreciated.

+1  A: 

By default Spring beans are singletons, that is subsequent calls to context.getBean("testBean") would return the same instance. If you want them to return different instances, you should set a scope = "prototype" on the bean definition:

<bean id="testBean" class="com.spring.ioc.TestClass" scope = "prototype"> 
...
axtavt
Before I celebrate I just want to confirm that hitting the context.refresh button wont update past instances of this bean?
Yes, it wouldn't.
axtavt
Brilliant. Thanks.