Spring实战读书笔记
第三章:高级装配
在我们上面所提到的bean的装配,Spring都是会创建所有的bean,不过有时候我们可能会在不同的时候使用到不同bean,而不是一次会使用到所有的bean,我们可以为bean的创建加一些条件,让Spring根据不同的条件去初始化不同的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
-
调用方法和访问对象的属性
-
对值进行算术、关系和逻辑运算
-
正则表达式匹配
-
集合操作
-