Spring注入外部文件的值有几种方式:
Spring Environment
在Spring中,处理外部值的最简单方式就是声明属性源并通过Spring的Environment来检索属性。
声明一个Phone接口:
1 | public interface Phone { |
实现类GooglePixel:
1 | public class GooglePixel implements Phone{ |
创建一个外部配置类:googlePixel.properties:
1 | phone.name=Google Pixel |
在JavaConfig中加载外部配置,并用Spring的Environment对象获取:
1 | import org.springframework.beans.factory.annotation.Autowired; |
测试是否注入成功:
1 | public class Test { |
控制台输出:
1 | Google Pixel,cpu型号:Qualcomm Xiaolong 821,电池容量:2770mAh |
getProperty()方法并不是获取属性值的唯一方法,getProperty()方法有四个重载的变种形式:
1 | String getProperty(String key) |
前两种形式的getProperty()方法都会返回String类型的值。上面的栗子使用第一种getProperty()方法。稍微对@Bean方法进行一下修改,这样在指定属性不存在的时候,会使用一个默认值:
1 | "googlePixel") (name= |
剩下的两种getProperty()方法与前面的两种非常类似,但是它们可以传入类型。
Environment还提供了几个与属性相关的方法,如果你在使用getProperty()方法的时候 没有指定默认值,并且这个属性没有定义的话,获取到的值是null。如果你希望这个属性必须要定义,那么可以使用getRequiredProperty()方法,如下所示:
1 | "googlePixel") (name= |
在这里,如果phone.name或phone.cpu或phone.battery属性没有定义的话,将会抛出 IllegalStateException异常。
如果想检查一下某个属性是否存在的话,那么可以调用Environment的 containsProperty()方法:
1 | boolean nameExists = env.containsProperty("phone.name"); |
属性占位符
创建一个phone-config.xml文件,使用Spring context命名空间中的context:propertyplaceholder元素生成PropertySourcesPlaceholderConfigurer bean
:
1 |
|
测试:
1 | (SpringJUnit4ClassRunner.class) |
输出结果同上。
或者不用XML显示配置Bean,开启自动扫描,使用注解注入属性值:
1 | <!-- 开启扫描 --> |
GooglePixel类属性注入:
1 |
|
或者构造器注入:
1 | ... |
util:properties
在phone-config.xml文件中:
1 |
|
和占位符区别是,这里需要用spEL表达式获取属性的值,并且不能写为:”#{p.phone.name}”,这样Spring读取不到属性值,将会抛出异常。
使用注解配置和占位符类似,比如set注入:
1 | ... |
或者使用systemProperties来代替p:
1 | ... |
some:
XML
1 | <context:property-placeholder location="classpath:....properties"/> |
注解:
1 | "classpath:....properties") (value = |