本系列博客为spring In Action 这本书的学习笔记
我们知道Spring的特性之一就是它的依赖注入机制. 那么当我们提到依赖注入最先想到的应该是Bean与Bean之间的依赖注入, 也就是我们前面大篇幅谈到的装配Bean, 但是依赖注入的另一个方面就是指将一个值注入到Bean的属性或者构造器参数中, 本篇博客就是来探讨一下关于值注入的一些问题.
一. 运行时值注入
在说明运行时值注入之前, 我们先来看一下在前面的博客里出现过的值注入的例子.
程序1: 在JavaConfig中的值注入的例子
@Bean
public CompactDisc jay(){
return new Jay("魔杰座", "周杰伦");
}
程序2: 在XML中的值注入例子
<bean id="jay" class="AssemblingBean.SoundSystem_XML.Jay" >
<constructor-arg index="0" value="魔杰座"/>
<constructor-arg index="1" value="周杰伦"/>
</bean>
在前面的时候, 我们是这样使用值注入来组装这个jay Bean的, 可以看到, 无论是使用JavaConfig还是使用XML, 在实现值注入的时候都是将值硬编码在配置类中. 有的时候硬编码是可以的, 但是很多时候, 我们会希望能避免硬编码值, 而是让这些值在运行的时候再确定并且注入, 也就是运行时值注入.
为了实现运行时注入, Spring提供了两种方式:
- 1. 属性占位符
- 2. Spring表达式语言
属性占位符比较简单, 但是Spring表达式语言功能更为强大, 下面来详细看一下它们的用法.
1. 使用属性占位符注入外部的值
在Spring中, 处理外部值的最简单方式就是声明属性源并通过Spring的Environment来检索属性.
下面的例子就展现了一个基本的Spring配置类, 它使用外部的属性来装配jay Bean.
程序3: 使用PropertySource注解和Environment
@Configuration
@PropertySource("classpath:/AdvancedAssembly/RunTimeInjection/app.properties") //声明属性源
public class ExpressiveConfig {
@Autowired
Environment environment;
@Bean
public CompactDisc jay(){
return new Jay(
environment.getProperty("jay.title"),
environment.getProperty("jay.artist")
); //检索属性值
}
}
程序4: app.properties
jay.title = "魔杰座"
jay.artist = "周杰伦"
在这个例子中, @PropertySource引用了类路径中一个名为app.properties的属性文件, 这个属性文件会加载到Spring的Environment中, 可以从Environment中检索属性. 同时, 在jay()这个方法中会创建一个新的Jay, 它的构造器参数时从属性文件中获取的, 而这是通过调用getProperty()实现的.
为什么从Environment中就能拿到属性文件里面的属性值呢? 这就要看一下Environment中都有什么了.
(1) 深入学习Spring的Environment
1. 获取属性的值: getProperty()
在Environment中关于getProperty()方法有四个重载的形式, 如下: