2012-02-22 5 views
3

У меня в приложении есть application-context.xml. Теперь я инстанцирование ApplicationContext как:Pass Parameter to ApplicationContext

ApplicationContext context = new ClassPathXmlApplicationContext("application-context.xml"); 

Можно ли передать параметры через эту конкретизацию, так что эти параметры могут быть использованы для инициализации некоторых свойств некоторых бобов?

PS: Не использовать файл свойства. Поскольку параметры генерируют время выполнения, например, местоположение exicutable jar, системную архитектуру, имя os и т. Д., Которое является переменной.

ответ

4

Вот решение, я отправляю его, может быть полезным для кого-то в будущем:

Бин класс:

public class RunManager { 

    private String jarPath; 
    private String osName; 
    private String architecture; 

    public RunManager() { 

    } 

    public RunManager(String[] args) { 
     this.jarPath = args[0]; 
     this.osName = args[1]; 
     this.architecture = args[2]; 
    } 

    public String getJarPath() { 
     return jarPath; 
    } 

    public void setJarPath(String jarPath) { 
     this.jarPath = jarPath; 
    } 

    public String getOsName() { 
     return osName; 
    } 

    public void setOsName(String osName) { 
     this.osName = osName; 
    } 

    public String getArchitecture() { 
     return architecture; 
    } 

    public void setArchitecture(String architecture) { 
     this.architecture = architecture; 
    }  
} 

Инициализация ApplicationContext:

DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); 
BeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(RunManager.class).addConstructorArgValue(args).getBeanDefinition(); 
beanFactory.registerBeanDefinition("runManager", beanDefinition); 
GenericApplicationContext genericApplicationContext = new GenericApplicationContext(beanFactory); 
genericApplicationContext.refresh(); 
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(new String[] { "application-context.xml" }, genericApplicationContext);  

Ввод этой ссылки bean на другой компонент application-context.xml:

<bean id="configuration" class="jym.tan.movielibrary.configuration.Configuration" >  
    <property name="runManager" ref="runManager" /> 
</bean> 

Спасибо.

+5

Этот подход проще http://forum.springsource.org/showthread.php?71815-Passing-Bean-properties-using-java-util-Properties. –

6

Вы можете использовать PropertyPlaceholderConfigurer в вашем applicationContext.xml

<context:property-placeholder location="classpath:my.properties"/> 

Это позволяет ссылаться на свойства непосредственно в ваших декларациях боб с помощью синтаксиса ${myProperty} предполагается, что файл свойств содержит свойство с именем myProperty.

Образец, как вы можете использовать такое свойство:

<bean id="foo" class="com.company.Foo"> 
    <property name="bar" value="${myProperty}"/> 
</bean> 

Другой альтернатива может быть основана на @Value аннотации питания от SpEL.

+1

благодарит за ваш ответ. Мне нужно это без файла свойств. Я должен был упомянуть об этом до –

+2

@TapasBose, оба подхода поддерживают системные свойства, если это поможет вам –

+0

Я очень ценю вашу помощь. Спасибо :) –