【问题标题】:Does Spring Support JSON Configuration?Spring 是否支持 JSON 配置?
【发布时间】:2012-04-19 18:14:48
【问题描述】:

有谁知道 Spring 是否有任何扩展允许通过 JSON(或任何其他格式)而不是 XML 配置其 ApplicationContext?我在官方文档中找不到任何内容,但我想知道是否有任何其他开源扩展可以允许这样做。

为了清楚起见,我不是在谈论配置 SpringMVC 以设置基于 RESTful JSON 的 Web 服务或类似的东西,只要可以通过 JSON 而不是 XML 进行 Spring 应用程序配置。

【问题讨论】:

    标签: json spring applicationcontext


    【解决方案1】:

    据我所知,没有项目支持 JSON 作为配置源。启动起来应该比较容易,(Spring 容器不依赖 XML,它只是构造 bean 定义的一种方式)。然而,这比您想象的要多得多。

    请注意,Spring 提供了 来帮助您编写正确的 XML。在 JSON 中你不会得到那么多。此外,许多 DSL 构建在 Spring XML 和自定义命名空间支持之上( 和其他人使用它)。

    如果你讨厌 XML(很多人讨厌),试试 Java 配置,它从 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() 在这里只被调用一次,即使被引用了两次。

    【讨论】:

    • 谢谢。我想我会尽量坚持注释。并不是真的讨厌 XML 本身,但我会很高兴有一些替代品。
    【解决方案2】:

    试试 maven Central 上的 JSConf 库,它支持属性、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");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2022-01-15
      • 2014-05-23
      • 2023-03-14
      • 2011-07-02
      • 1970-01-01
      • 2016-10-12
      • 1970-01-01
      • 2015-08-04
      • 2018-07-26
      相关资源
      最近更新 更多