从 Spring 上下文到 Spring 注释



我正在将我的项目包从Spring xml文件配置移动到类注释配置。 我卡在另一个上下文 xml 文件中定义的 Bean 上失败的 Bean 实例化。 这是定义:

<bean id="mglsChecker" class="DefaultMglsAdapter" destroy-method="close">
<constructor-arg value="${mgls.server.address}"/>
<constructor-arg value="${mgls.fname}"/>
<constructor-arg value="${mgls.lcount}"/>
</bean> 

mglsChecker 类是在整个"解决方案"通用的基础设施包中定义的。 问题是变量"${}"没有定义,所以现在这个类没有实例化。 当我的项目是xml文件配置时,我不明白它是如何工作的。 在原始应用程序上下文中.xml我没有看到对此 mglsChecker 上下文文件的任何引用。 任何帮助我应该在哪里调查?我错过了什么? 谢谢

您可以使用

@Configuration
class YourConfig {
// you usually don't need to explicitly give the bean name
// if you don't, Spring gives it the config's method name
@Bean(name = "mglsChecker", destroyMethod = "close") 
MglsAdapter mglsChecker(@Value("${mgls.server.address}") String address,
@Value("${mgls.fname}") String  fname,
@Value("${mgls.lcount}") long lcount) {
return new DefaultMglsAdapter(address, fname, lcount);
}
}

就个人而言,我更喜欢创建@Component类,但为此您需要能够编辑DefaultMglsAdapter类。

@Component
class DefaultMglsAdapter implements MglsAdapter {
// fields to hold the configs
DefaultMglsAdapter(@Value("${mgls.server.address}") String address,
@Value("${mgls.fname}") String  fname,
@Value("${mgls.lcount}") long lcount) {
// set fields
}
@PreDestroy
void close() {
// cleanup
}
}

编辑:纳入安德烈亚斯的更正:)

通过以下方式加载 java 文件中的属性

@Configuration
@PropertySource("classpath:foo.properties")
public class DefaultMglsAdapter{
//...
}

通过以下方式注入属性

@Value( "${mgls.server.address}" )
private String serverAddress;

用"${}"语法提到的变量是属性的键/占位符。 请从 *.properties 或 *.config 或 *.xml 或任何此类自定义属性文件中搜索或查找此类键。如果找到任何此类属性文件,请指定要在其中配置该文件的类路径或位置,如下所示:

通过 XML:

<context:property-placeholder location="classpath:path/to/PropertiesFile"/>    

通过注释:

@Configuration    
@PropertySource("classpath:path/to/PropertiesFile")    
@Value("${Property}")

谢谢和问候。

最新更新