返回介绍

3.5.1 注入外部的值

发布于 2024-08-17 00:45:50 字数 4184 浏览 0 评论 0 收藏 0

在Spring中,处理外部值的最简单方式就是声明属性源并通过Spring的Environment来检索属性。例如,程序清单3.7展现了一个基本的Spring配置类,它使用外部的属性来装配BlankDisc bean。

程序清单3.7 使用@PropertySource注解和Environment

在本例中,@PropertySource引用了类路径中一个名为app.properties的文件。它大致会如下所示:

这个属性文件会加载到Spring的Environment中,稍后可以从这里检索属性。同时,在disc()方法中,会创建一个新的BlankDisc,它的构造器参数是从属性文件中获取的,而这是通过调用getProperty()实现的。

深入学习Spring的Environment

当我们去了解Environment的时候会发现,程序清单3.7所示的getProperty()方法并不是获取属性值的唯一方法,getProperty()方法有四个重载的变种形式:

前两种形式的getProperty()方法都会返回String类型的值。我们已经在程序清单3.7中看到了如何使用第一种getProperty()方法。但是,你可以稍微对@Bean方法进行一下修改,这样在指定属性不存在的时候,会使用一个默认值:

剩下的两种getProperty()方法与前面的两种非常类似,但是它们不会将所有的值都视为String类型。例如,假设你想要获取的值所代表的含义是连接池中所维持的连接数量。如果我们从属性文件中得到的是一个String类型的值,那么在使用之前还需要将其转换为Integer类型。但是,如果使用重载形式的getProperty()的话,就能非常便利地解决这个问题:

Environment还提供了几个与属性相关的方法,如果你在使用getProperty()方法的时候没有指定默认值,并且这个属性没有定义的话,获取到的值是null。如果你希望这个属性必须要定义,那么可以使用getRequiredProperty()方法,如下所示:

在这里,如果disc.title或disc.artist属性没有定义的话,将会抛出IllegalStateException异常。

如果想检查一下某个属性是否存在的话,那么可以调用Environment的containsProperty()方法:

最后,如果想将属性解析为类的话,可以使用getPropertyAsClass()方法:

除了属性相关的功能以外,Environment还提供了一些方法来检查哪些profile处于激活状态:

String[] getActiveProfiles():返回激活profile名称的数组;

String[] getDefaultProfiles():返回默认profile名称的数组;

boolean acceptsProfiles(String... profiles):如果environment支持给定profile的话,就返回true。

在程序清单3.6中,我们已经看到了如何使用acceptsProfiles()。在那个例子中,Environment是从ConditionContext中获取到的,在bean创建之前,使用acceptsProfiles()方法来确保给定bean所需的profile处于激活状态。通常来讲,我们并不会频繁使用Environment相关的方法,但是知道有这些方法还是有好处的。

直接从Environment中检索属性是非常方便的,尤其是在Java配置中装配bean的时候。但是,Spring也提供了通过占位符装配属性的方法,这些占位符的值会来源于一个属性源。

解析属性占位符

Spring一直支持将属性定义到外部的属性的文件中,并使用占位符值将其插入到Spring bean中。在Spring装配中,占位符的形式为使用“${ ... }”包装的属性名称。作为样例,我们可以在XML中按照如下的方式解析BlankDisc构造器参数:

可以看到,title构造器参数所给定的值是从一个属性中解析得到的,这个属性的名称为disc.title。artist参数装配的是名为disc.artist的属性值。按照这种方式,XML配置没有使用任何硬编码的值,它的值是从配置文件以外的一个源中解析得到的。(我们稍后会讨论这些属性是如何解析的。)

如果我们依赖于组件扫描和自动装配来创建和初始化应用组件的话,那么就没有指定占位符的配置文件或类了。在这种情况下,我们可以使用@Value注解,它的使用方式与@Autowired注解非常相似。比如,在BlankDisc类中,构造器可以改成如下所示:

为了使用占位符,我们必须要配置一个PropertyPlaceholderConfigurer bean或PropertySourcesPlaceholderConfigurer bean。从Spring 3.1开始,推荐使用PropertySourcesPlaceholderConfigurer,因为它能够基于Spring Environment及其属性源来解析占位符。

如下的@Bean方法在Java中配置了PropertySourcesPlaceholderConfigurer:

如果你想使用XML配置的话,Spring context命名空间中的<context:propertyplaceholder>元素将会为你生成PropertySourcesPlaceholderConfigurer bean:

解析外部属性能够将值的处理推迟到运行时,但是它的关注点在于根据名称解析来自于Spring Environment和属性源的属性。而Spring表达式语言提供了一种更通用的方式在运行时计算所要注入的值。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文