有谁知道 Spring 是否有任何扩展允许通过 JSON(或任何其他格式)而不是 XML 配置其 ApplicationContext?我在官方文档中找不到任何内容,但我想知道是否有任何其他开源扩展可以允许这样做。
为了清楚起见,我不是在谈论配置 SpringMVC 以设置基于 RESTful JSON 的 Web 服务或类似的东西,只要可以通过 JSON 而不是 XML 进行 Spring 应用程序配置。
有谁知道 Spring 是否有任何扩展允许通过 JSON(或任何其他格式)而不是 XML 配置其 ApplicationContext?我在官方文档中找不到任何内容,但我想知道是否有任何其他开源扩展可以允许这样做。
为了清楚起见,我不是在谈论配置 SpringMVC 以设置基于 RESTful JSON 的 Web 服务或类似的东西,只要可以通过 JSON 而不是 XML 进行 Spring 应用程序配置。
据我所知,没有项目支持 JSON 作为配置源。启动起来应该比较容易,(Spring 容器不依赖 XML,它只是构造 bean 定义的一种方式)。然而,这比你想象的要多得多。
请注意,Spring 提供了xml-schema来帮助您编写正确的 XML。在 JSON 中你不会得到那么多。许多 DSL 也建立在 Spring XML 和自定义命名空间支持之上(spring-integration、mule-esb和其他人使用它)。
如果你讨厌 XML(很多人讨厌),试试 Java Configuration,它从 3.0 开始可用,并在 3.1 中得到了改进:
@Configuration
public class MyBeans {
@Bean
public Foo foo() {
return new Foo();
}
@Bean
public Bar bar() {
return new Bar(foo());
}
@Bean
public Buzz buzz() {
Buzz buzz = new Buzz();
buzz.setFoo(foo());
return buzz;
}
}
有趣的事实:由于一些花哨的代理,foo()
这里只调用了一次,即使引用了两次。
试试maven Central 上的JSConf库,它支持 Properties、HOCON 和 JSON 格式。
您可以将外部文件中的值注入您的服务等等!
JavaConfig 的示例用法:
您存储在文件app.conf中的数据
{
"root":{
"simpleConf":{
"url":"Hello World",
"port":12,
"aMap":{
"key1":"value1",
"key2":"value2"
},
"aList":[
"value1",
"value2"
]
}}
您在必须注入配置的地方提供服务
@Service("service")
public class Service {
@Autowired
private ConfigBean configBean;
}
声明一个接口以从您的服务访问您的配置值
@ConfigurationProperties("root/simpleConf")
public interface ConfigBean {
String getUrl();
int getPort();
Map getAMap();
List getAList();
}
还有你的 Spring 配置 bean:
@Configuration
public class ContextConfiguration {
@Bean
public static ConfigurationFactory configurationFactory() {
return new ConfigurationFactory().withResourceName("app.conf") //
.withScanPackage("org.jsconf.core.sample.bean");
}
}