Spring 运行时值注入(spring in action)

---恢复内容开始---

  当讨论依赖注入的时候,我们通常所讨论的是将一个bean引用注入到另一个bean的属性或构造器参数中。它通常来讲指的是将一个对象与另一个对象进行关联。
但是bean装配的另外一个方面指的是将一个值注入到bean的属性或者构造器参数中。通常我们会使用XML或BeanConfig指定值注入,但是它是将硬编码配置在类或XML中。

@Bean
    public Pool pool() {
        return new Pool("Mm", 5);
    }

<bean id="pool" class="com.gantong.gantong.demo.Pool">
  <constructor-arg name="name" value="Mm"/>
  <constructor-arg name="size" value="5"/>
</bean>

 

  有时候硬编码是可以的,但有的时候,我们可能会希望避免硬编码值,而是想让这些值在运行时再确定。为了实现这些功能,Spring提供了两种在运行时求值的方式:
  1.属性占位符(Property placeholder)
  2.Spring表达式语言(SpEL)

  很快你就会发现这两种技术的用法是类似的,不过它们的目的和行为是有所差别的。让我们先看一下属性占位符,在这两者中它较为简单,然后再看一下更为强大的SpEL。

#app.properties
pool.name=Mm
pool.size=5

@Component
@PropertySource(value = { "classpath:app.properties" })
public class DemoConfig {
    @Autowired
    private Environment env;

    @Bean
    public Pool pool() {
        return new Pool(env.getProperty("pool.name")
                , env.getProperty("pool.size", Integer.class));
    }
}


  Spring一直支持将属性定义到外部的属性的文件中,并使用占位符值将其插入到Spring bean中。在Spring装配中,占位符的形式为使用“${... }”包装的属性名称。

  如果我们依赖于组件扫描和自动装配来创建和初始化应用组件的话,那么就没有指定占位符的配置文件或类了。在这种情况下,我们可以使用@Value注解,它的使用方式与@Autowired注解非常相似。我们必须要配置一个PropertyPlaceholderConfigurer bean或PropertySourcesPlaceholderConfigurer bean。从Spring3.1开始,推荐使用PropertySourcesPlaceholderConfigurer,因为它能够基于Spring Environment及其属性源来解析占位符。如果你想使用XML配置的话,Spring context命名空间中的<context:propertyplaceholder>元素。

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

  Spring 3引入了Spring表达式语言(Spring Expression Language,SpEL),它能够以一种强大和简洁的方式将值装配到bean属性和构造器参数中,在这个过程中所使用的表达式会在运行时计算得到值。使用SpEL,你可以实现超乎想象的装配效果,这是使用其他的装配技术难以做到的(甚至是不可能的)。
  SpEL拥有很多特性,包括:
    1.使用bean的ID来引用bean
    2.调用方法和访问对象的属性
    3.对值进行算术、关系和逻辑运算
    4.正则表达式匹配
    5.集合操作

  需要了解的第一件事情就是SpEL表达式要放到“#{ ... }”之中,这与属性占位符有些类似,属性占位符需要放到“${ ... }”之中。

 

posted on 2017-10-24 11:45  失控的bug  阅读(97)  评论(0)    收藏  举报