将参数传递给ApplicationContext

时间:2012-02-22 18:15:30

标签: java spring applicationcontext

我的应用程序我有一个application-context.xml。现在我将ApplicationContext实例化为:

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

是否可以通过此实例化传递参数,以便可以使用这些参数初始化某些bean的某些属性?

PS:不使用属性文件。由于参数是生成运行时间的,比如exicutable jar的位置,系统架构,os名称等是可变的。

2 个答案:

答案 0 :(得分:6)

您可以使用applicationContext.xml

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

这允许您使用语法${myProperty}直接在bean声明中引用属性,假设属性文件包含名为myProperty的属性。

如何使用此类属性的示例:

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

另一种替代方案可以基于由SpEL提供的@Value注释。

答案 1 :(得分:5)

以下是我发布的解决方案,可能对将来的人有所帮助:

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引用注入application-context.xml的另一个bean:

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

感谢。