Передать параметр в ApplicationContext - PullRequest
3 голосов
/ 22 февраля 2012

У меня в приложении есть application-context.xml. Теперь я создаю экземпляр ApplicationContext как:

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

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

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

Ответы [ 2 ]

6 голосов
/ 22 февраля 2012

Вы можете использовать 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.

5 голосов
/ 22 февраля 2012

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

Класс Bean:

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-компонента в другой bean-компонент application-context.xml:

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

Спасибо.

...