- spring装载bean的时候,可以依据不同环境(全局变量值)对不同的bean进行初始化。这样可以让系统根据不同环境采用最佳实现方式。(开发环境、测试环境、QA环境、生产环境甚至是前端开发环境)
@profile - spring装配bean的时候,可以依据不同的条件判定(系统环境变量值、依赖bean是否装配、自定义表达式结果等)决定是否对bean进行装配。
@Conditional - 当现实情况(一个接口多个实现类)无法满足自动装配的条件(被装配的bean有唯一的实现类)时,spring提供以下方式明确唯一的实现类
3.1 标示首选的bean
@Primary
缺点是当@Primary出现多次的话,spring一样不知道应该采用哪个。
3.2 限定自动装配的bean,对所有可选的bean进行筛选。其实删选条件就是bean的id名。
@Qualifier(“筛选条件”)
缺点是当bean的名字变更后,bean的id(默认的)也会随之变更,此时筛选条件就失效了。
3.3 创建自定义的限定符,与3.2基本一致,只是为bean定义一个固定的id,这样bean名称变更不会影响bean的id。筛选条件就不需要变更了。
缺点,如果自定义了相同的id名,spring一样无法自动装配。
3.4 使用自定义的限定符注解,原理与3.3相同,只是为一个bean设定多个id,在装配的地方也使用多个id进行筛选。例如如此定义一个bean(食物、肉类、羊肉、切片),装配时设定筛选条件(食物、肉类、羊肉、切片)。这样spring就可以找到对应的类了。
缺点:sprnig不允许同一个注解重复出现。需要自定义一个继承了@Qualifier注解的注解。装配时使用自定义的注解进行设置。
4.bean的生命周期
spring默认是采用单例模式创建实例的。不过单例并不能满足所有情况。
spring支持以下四种模式:
单例:在整个应用中,只创建bean的一个实例。
原型:每次注入或者通过spring应用上下文获取的时候,都会创建一个新的bean实例。
会话:在web应用中,为每个会话创建一个bean实例。
请求:在web应用中,为每个请求创建一个bean实例。
特殊情况:将会话bean注入到单例bean中。单例bean在项目启动时创建,而此时会话bean并没有创建,将导致自动装配失败。此时需要在会话bean注解中注明懒解析。这样在单例bean构建时,spring会创建一个代理类去set属性。当单例调用会话bean的时候,再使用当前会话内的bean实例代替代理类去执行。
5.运行时值注入
运行时注入与普通注入的区别在于,普通注入的发生点在项目启动时执行,运行时注入的发生点在项目运行过程中执行。
spring提供了两种方式来实现运行注入
1. 属性占位符
2. spring表达式语句(spel)