我的应用程序我有一个application-context.xml。现在我将ApplicationContext实例化为:
ApplicationContext context = new ClassPathXmlApplicationContext("application-context.xml");
是否可以通过此实例化传递参数,以便可以使用这些参数初始化某些bean的某些属性?
PS:不使用属性文件。由于参数是生成运行时间的,比如exicutable jar的位置,系统架构,os名称等是可变的。
答案 0 :(得分:6)
您可以使用applicationContext.xml
<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>
感谢。