Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring: Programmatically use PropertyPlaceHolderConfigurer on none Singelton Beans

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.

like image 282
Babyangle86 Avatar asked Mar 01 '10 15:03

Babyangle86


1 Answers

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"> 
...
like image 58
axtavt Avatar answered Oct 24 '22 00:10

axtavt