Spring in Action 阅读(3)—— 高级装配

环境与profile
Spring引入了bean profile的功能。要使用profile,你首先要将所有不同的bean 定义整理到一个或多个profile之中,在将应用部署到每个环境时,要确保对应的profile处于 激活(active)的状态。
从Spring 3.2开始,你也可以在 方法级别上使用@Profile注解,与@Bean注解一同使用。这样的话,就能将这两个bean的 声明放到同一个配置类之中,如下所示:
在这里插入图片描述
同样上述操作可以利用XML实现。
激活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。

条件化的bean
Spring 4引入了一个新的 @Conditional注解,它可以用到带有@Bean注解的方法上。如果给定的条件计算结果 为true,就会创建这个bean,否则的话,这个bean会被忽略。
在这里插入图片描述
@Conditional将会通过Condition接口进行条件对比:
在这里插入图片描述
处理自动装配的歧义性
如果不仅有一个bean能够匹 配结果的话,这种歧义性会阻碍Spring自动装配属性、构造器参数或方法参数。可选bean中的某一个设为首选(primary)的bean,或者使用限定符(qualifier)来帮助Spring 将可选的bean的范围缩小到只有一个bean。
限定自动装配的Bean。
在Spring中,可以通过**@Primary**来表达最喜欢的方 案。@Primary能够与@Component组合用在组件扫描的bean上,也可以与@Bean组合用在 Java配置的bean声明中。

@Qualifier注解是使用限定符的主要方式。它可以与@Autowired和@Inject协同使 用,在注入的时候指定想要注入进去的是哪个bean。为@Qualifier注解所设置的参数就是想要注入的bean的 ID。
可以添加多个@Qualifier注解来缩减类的范围,但是Java不允许在同一个条目上重复出现相同类型的多个注解。但是,我们可以创建自定义的限定符注解,借助这样的注解来表达bean所希望限定的特性,例如,这样我们将不 再使用@Qualifier(“cold”),而是使用自定义的@Cold注解,在这里插入图片描述
bean的作用域
Spring定义了多种作用域,可以基于这些作用域创建bean,包括:
单例(Singleton):在整个应用中,只创建bean的一个实例。
原型(Prototype):每次注入或者通过Spring应用上下文获取的时候,都会创建一个新 的bean实例。
会话(Session):在Web应用中,为每个会话创建一个bean实例。
请求(Rquest):在Web应用中,为每个请求创建一个bean实例。

就购物车bean来说,会话作用域是最为合适的,因为它与给定的用户关联性最大。要指定会 话作用域,我们可以使用@Scope注解,它的使用方式与指定原型作用域是相同的:
在这里插入图片描述SCOPE_SESSION常量是会话的seesion,,proxyMode属性被设置成了ScopedProxyMode.INTERFACES,这表明这个代理要实现ShoppingCart接口,并将调用委托给实现bean。
在这里插入图片描述
aop:scoped-proxy是与@Scope注解的proxyMode属性功能相同的Spring XML配置元 素。它会告诉Spring为bean创建一个作用域代理。默认情况下,它会使用CGLib创建目标类的 代理。但是我们也可以将proxy-target-class属性设置为false,进而要求它生成基于 接口的代理:
在这里插入图片描述
运行时值注入
我们可能会希望避免硬编码值,而是想让这些值在运 行时再确定。为了实现这些功能,Spring提供了两种在运行时求值的方式:
属性占位符(Property placeholder)。 Spring表达式语言(SpEL)。

@PropertySource引用了类路径中一个名为app.properties的文件,属性文件会加载到Spring的Environment中,稍后可以从这里检索属性。
在这里插入图片描述
Spring 3引入了Spring表达式语言(Spring Expression Language,SpEL),它能够以一种强大 和简洁的方式将值装配到bean属性和构造器参数中,
是SpEL表达式要放到“#{ … }”之中,这与属性占位符有些类 似,属性占位符需要放到“${ … }”之中。
SpEL表达式可以简单的调用BEAN对象方法、属性以及各种不同的值
在这里插入图片描述
在SpEL中访问类作用域的方法和常量的话,要依赖T()这个关键的运算符。T()运算符的真正价值 在于它能够访问目标类型的静态方法和常量。
SpEL通过了一元运算符、二元运算以及三元运算,同时可以使用正则表达式。

在这里插入图片描述
其次它还能引用集合在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值