Spring框架_3.5_运行时值注入

注:本博文使用的是spring 4.x

内容:运行时值注入

我们所讨论的Bean的装配并非DI(依赖注入),bean的装配是指将一个值注入到bean的属性中或者构造器的参数中。属性值可能是String类型、整型、浮点型等,而依赖注入注入的是对象的引用,它的目的是使两个对象关联起来。

让我们来看一个简单的例子

@Bean
public Book ChineseBook(){
      return new ChineseBook("人民出版社");
}
这里通过构造方法给ChineseBook注入了出版社的信息,这种方式可以实现需求,但是直接通过在配置类中采用硬编码的方式配置在配置类中会很影响代码的灵活性。

类似在XML文件中

<Bean id="book"
      class = "com.tmr.ChineseBook"
      c:_publish = "人民出版社"  />

也是采用硬编码的方式直接写在配置文件中。这么做的后果就是在对象还没有创建之前你就已经确定了对象的信息。你可能没有感受到它的恐怖之处。

恐怖之处是什么?如果我想得到一本语文书,那么在spring注入对象之前,语文书的出版社已经限制在了人民出版社,我要想做出修改除非修改配置类或者XML

也许你会认为修改就修改嘛,没什么大不了的,但是如果有一种更优秀的机制,就是类里面的属性值在创建的时候才会确定,那么你什么时候想修改出版社的信息将变得非常方便。为了避免这种因编码值,spring提供了两种在运行时求值的方式:

1、属性占位符

2、Spring表达式语言(SpEL)


@PropertySource注解


@Configuration
@PropertySource("classpath:/com/tmr/love.properties")
public class ExpressiveConfig{
	
	@Autowired
	Environment env;
	
	@Bean
	public ChinsesBook chineseBook(){
		return new ChinsesBook(){
			env.getProperty("book.publish"));
		}
	}
}
@PropertySource("classpath:/com/tmr/love.properties")引用了类路径中的文件,内容如下:

book.publish=人民出版社

这个属性文件会加载到spring的Environment中,然后使用该类的方法即可检索出配置信息



spring中的Environment
spring中使用Environment来获取属性值
该类共有四个重载方法
String getProperty(String key)
String getProperty(String key, String defauleValue)
T getProperty(String key, Class<T> type)
T getProperty(String key, Class<T> type, T defaultValue)
第二种方法会这只一个默认值。当指定的属性不存在的时候就会使用这个默认值。
下面两种方法和前面两种方法类似,只不过前面两种方法返回的是String类型,而后面返回的是其他类型的数据。
Environment还提供了几个与属性相关的方法,如果你在使用getProperty()方法时没有指定默认值,并且之恶个属性没有定义的话,获取到的值为null,如果你希望这个属性必须要定义,那么可以使用getRequiredProperty()方法
使用这种方法如果属性没有定义的话,将会抛出IllegalStateException异常。
如果想检查一下某个属性是否存在的话,可以调用
Environment的containsProperty()方法。
如果想将属性解析为类的话,可以使用getPropertyAsClass()方法。
Environment还提供了一些方法来检查哪些profile处于激活状态:
String [] getActiveProfiles():返回激活profile名称的数组
String [] getDefaultProfiles():返回默认profile名称的数组
boolean acceptsProfiles(String ...profiles):如果environment支持给定profile的话,就返回true

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值