《Spring实战4》第3章 高级装配

第1部分 Spring的核心

第3章 高级装配

  • Spring profile
  • 条件化的bean声明
  • 自动装配与歧义性
  • bean的作用域
  • Spring表达式语言

3.1 环境与profile

不同的环境同一个功能可能需要不同的bean

3.1.1 配置profile bean

要使用profile,首先要讲所有不同的bean定义整理到一个或多个profile中。

  • 在Java配置中,可以使用@Profile注解指定某个bean属于哪一个profile。
    在这里插入图片描述

    在这里插入图片描述

  • 在XML中配置profile
    在这里插入图片描述

3.1.2 激活profile

Spring在确定哪个profile处于激活状态时,需要依赖两个独立的属性:spring.profiles.active和spring.profiles.default

  • 如果设置了spring.profiles.active属性的话,那么它的值就会用来确定哪个profile是激活的。
  • 如果没有设 置spring.profiles.active属性的话,那Spring将会查找spring.profiles.default的值。
  • 如 果spring.profiles.active和spring.profiles.default均没有设置的话,那就没有激活的profile,因此只会创建那些没有定义在 profile中的bean。

有多种方式来设置这两个属性:

  • 作为DispatcherServlet的初始化参数;
  • 作为Web应用的上下文参数;
  • 作为JNDI条目;
  • 作为环境变量;
  • 作为JVM的系统属性;
  • 在集成测试类上,使用@ActiveProfiles注解设置。

3.2 条件化的bean

Spring 4引入了一个新的@Conditional注解,它可以用到带有@Bean注解的方法上。如果给定的条件计算结果为true,就会创建这个bean,否则的话,这个bean会被忽略。

在这里插入图片描述

3.3 处理自动装配的歧义性

自动装配时,合适的bean不唯一时,会报错,歧义性

3.3.1 标示首选的bean

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.3.2 限定自动装配的bean

  • 创建自定义的限定符
    在这里插入图片描述
    在这里插入图片描述

  • 使用自定义的限定符注解
    在这里插入图片描述
    在这里插入图片描述

3.4 bean的作用域

Spring定义了多种作用域,可以基于这些作用域创建bean,包括:

  • 单例(Singleton):在整个应用中,只创建bean的一个实例。
  • 原型(Prototype):每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean实例。
  • 会话(Session):在Web应用中,为每个会话创建一个bean实例。
  • 请求(Rquest):在Web应用中,为每个请求创建一个bean实例。

单例 是默认的作用域。如果选择其他的作用域,要使用 @Scope 注解

原型 作用域,使用 ConfigurableBeanFactory 类的 SCOPE_PROTOTYPE 常量设置了原型作用域,如下:

  • 自动装配
    在这里插入图片描述
  • Java配置
    在这里插入图片描述
  • XML配置
    在这里插入图片描述

3.4.1 使用会话和请求作用域

在这里插入图片描述
使用@Scope注解,将value设置成了WebApplicationContext中的SCOPE_SESSION常量(它的值是session),每个会话创建一个。
@Scope同时还有一个proxyMode属性,它被设置成了ScopedProxyMode.INTERFACES。这个属性解决了将会话或请求作 用域的bean注入到单例bean中所遇到的问题。

作用域代理:
在这里插入图片描述

3.4.2 在XML中声明作用域代理

在这里插入图片描述

3.5 运行时值注入

Spring提供了两种在运行时求值的方式:

  • 属性占位符(Property placeholder)。
  • Spring表达式语言(SpEL)。

3.5.1 注入外部的值

  • 声明属性源并通过Spring的Environment来检索属性
    在这里插入图片描述

  • Spring的Environment中getProperty()方法有四种重载变种:
    在这里插入图片描述

  • 解析属性占位符
    在这里插入图片描述
    需要配置PropertySourcesPlaceholderConfigurer:
    在这里插入图片描述

3.5.2 使用Spring表达式语言进行装配

Spring 3引入了Spring表达式语言(Spring Expression Language,SpEL),它能够以一种强大和简洁的方式将值装配到bean属性和构造器参 数中,在这个过程中所使用的表达式会在运行时计算得到值。
SpEL拥有很多特性,包括:

  1. 使用bean的ID来引用bean;
  2. 调用方法和访问对象的属性;
  3. 对值进行算术、关系和逻辑运算;
  4. 正则表达式匹配;
  5. 集合操作。
  • SpEL样例
    SpEL表达式要放到“#{ … }”之中
    在这里插入图片描述
    类的方法:
    在这里插入图片描述
    bean的属性:
    在这里插入图片描述
    系统属性:
    在这里插入图片描述

  • 表示字面值
    表示浮点数、String值以及Boolean值
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 引用bean、属性和方法
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 在表达式中使用类型
    T()运算符
    在这里插入图片描述

  • SpEL运算符
    在这里插入图片描述

  • 计算正则表达式
    在这里插入图片描述

  • 计算集合
    集合和数组相关
    在这里插入图片描述
    在这里插入图片描述
    查询运算符(.?[]):
    在这里插入图片描述
    (.^[]) 和 (.$[]):查询第一个匹配项和最后一个匹配项
    在这里插入图片描述
    投影运算符(.![])
    在这里插入图片描述

3.6 小结

Spring profile,它解决了Spring bean要跨各种部署环境的通用问题。
结合使用@Conditional注解和Spring Condition接口的实现,能够为开发人员提供一种强大和灵活的机制, 实现条件化地创建bean。
两种解决自动装配歧义性的方法:首选bean以及限定符。
Spring能够让bean以单例、原型、请求作用域或 会话作用域的方式来创建。
Spring表达式语言,它能够在运行时计算要注入到bean属性中的值。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值