Spring实战之高级装配

Spring实战读书笔记

第三章:高级装配

    在我们上面所提到的bean的装配,Spring都是会创建所有的bean,不过有时候我们可能会在不同的时候使用到不同bean,而不是一次会使用到所有的bean,我们可以为bean的创建加一些条件,让Spring根据不同的条件去初始化不同的bean。

目录

第三章:高级装配

配置profile bean

激活profile

条件化配置bean

处理自动装配的歧义性

bean的作用域

运行时注入的两种方式


配置profile bean

  • @Profile注解既可以用在类上,也可以作用在方法上,它用来指定某个bean属于哪一个profile,只有当profile处于激活状态的时候bean才会被创建。

  • 在XML中,<beans>元素有profile属性,它有和@profile有相同的作用。我们还可以在 <beans>嵌套多个 <beans>,然后为每一个 <beans>配置profile属性。

激活profile

  • Spring在确定哪个profile处于激活状态时,会根据两个属性来判断:spring.profiles.active和spring.profiles.default,如果设置了active属性的话,spring会根据active的值知道哪个profile是激活的,如果没有设置active,spring则会去default中寻找。

  • 在web.xml文件中设置这两个属性的值:

<context-param>

    <param-name>spring.profiles.active</param-name>

    <param-value>dev</param-value>

</context-param>

 

条件化配置bean

  • spring4中引入了一个新的注解@Conditional,它可以修饰在@Bean注解修饰的地方。

  • 在注解内需要给定一个Class对象,而这个class需要实现Condition接口,实现了Condition接口后只需要实现接口内的matches方法即可。

  • 如果class对象的matches方法,返回true,则spring会创建带有@Conditional注解的bean。否则不会。

  • matches方法内有两个参数,ConditionContext和AnnotatedTypeMetadata,利用这两个参数,能更好的进行条件判断

  • spring4对@Profile进行了重构,使其基于@Conditional和Condition实现,引用ProfileCondition作为Condition的实现。

处理自动装配的歧义性

  • 当仅有一个bean匹配所需要的结果时,可以实现自动装配,但如果同时有多个bean匹配结果时,spring会抛出NoUniqueBeanDefinitionException。

  • @Primary注解可以将一个bean设为首选,它可以和@Componenet、@Bean注解一起使用

  • 使用@Qualifier注解可以限定自动装配的bean。它可以与@AutoWired一起使用,注入的时候指定要注入哪个bean。

@AutoWired

@Qualifier("iceCream")    //指明要注入iceCream对象

public void setDessert(Dessert dessert){

    this.dessert=dessert;

}
  • 还可以创建自定义限定符和自定义限定符注解,不过感觉意义不大。

 

bean的作用域

  • spring定义了多种作用域,默认是单例:

    • 单例(Singleton):整个应用中只创建bean的一个实例。

    • 原型(Prototype):每次注入或者通过spring应用上下文获取的时候,都会创建一个新的bean实例。

    • 会话(Session):在web应用中,为每个会话创建一个bean实例。

    • 请求(Request):在web应用中,为每个请求创建一个bean实例。

  • 使用@Scope注解可以修改bean的作用域,它可以与@Component和@Bean一起使用。使用@Scope修改作用域有两种方式:@Scope("prototype")和@Scrope(ConfigurableBeanFactory.SCOPE_PROTOTYPE),推荐使用第二种,因为不容易出错。

  • 如果使用XML配置的bean的话,<bean>元素内有scope属性,可以用它设置作用域。

 

运行时注入的两种方式

  • 属性占位符注入(${}):

    • 使用占位符注入必须要配置一个PropertySourcesPlaceholderConfigurer,因为它能够基于Spring Environment及其属性解析占位符。在Java中可以使用@Bean标签配置,在XML中使用<context:property-placeholder>元素可以生成PropertySourcesPlaceholderConfigurer对象。

  • Spring表达式(SpEL)注入(#{}),SpEl十分强大,它能做很多事情。在此不再一一示范:

    • 使用bean的ID来引用bean

    • 调用方法和访问对象的属性

    • 对值进行算术、关系和逻辑运算

    • 正则表达式匹配

    • 集合操作

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值