Spring学习总结之高级装配
1. profile
profile可以决定bean在什么环境下才被装配(开发环境、测试环境、线上环境等)
@Profile(“dev”)可以用在class之前,也可以用在类之前(Spring3.2),表示类或者方法返回类只有在dev环境激活时才被创建;也可以在XML文件中配置。
激活profile:作为DispatcherServelet的初始化参数
作为web应用的上下文参数
作为JNDI条目
作为环境变量
作为JVM的系统属性
在集成测试类上,使用@ActiveProfile注解设置
2. 条件化的Bean
@Conditional(条件),如果条件为true,就创建bean,否则就不创建
3. 自动装配歧义性
在自动装配时,一个接口可能有多个实现类,spring并不知道该装配哪一个bean,因此产生了歧义性
1)@Primary注解,与@Component或者@Bean组合使用,设置首选bean,当有歧义时,首选@Primary注解的bean,但是有多个首选bean时,同样会有歧义性
2)限定符@Qualifier,可与@Component或@Bean组合使用,限定符限制了装配的bean,装配的bean也必须有对应的限定符
4. bean的作用域
1) 单例(Singleton):在整个应用中只创建bean的一个实例
默认作用域
2) 原型(Prototype):每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean实例
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) 或者
XML中,bean标签添加scope=”prototype”
3) 会话(Session):在Web应用中,为每个会话创建一个bean实例
@Scope(value=WebApplicationContext.SCOPE_SESSION,proxyMode=ScopeProxyMode.INTERFACES)
例子:购物网站购物车,对于每一个用户的一次会话购物车是共用的,但是不同用户不同会话的购物车是不同的,会话作用域的bean就能够解决这种问题
关于proxyMode,作用域代理,可以延迟注入请求和会话作用域的bean,在注入时,会注入一个bean的代理,代理会暴露与bean相同的方法,当需要调用bean的方法时,由代理进行懒解析并调用委托给会话作用域内的bean
4) 请求(Request):在Web应用中,为每个请求创建一个bean实例
使用XML配置会话或请求作用域代理,使用aop命名空间的元素,如下:
<aop:scoped-proxy />,此时默认是使用CGLib创建目标类的代理,如果要创建目标借口的代理,需要添加proxy-target-class=”false”
5. 运行时植入
1) 属性占位符
格式:${…},另外需要在XML中配置<context:property-placeholder />
2) Spring表达式语言
格式:#{…}
使用bean的ID来引用bean;调用方法和访问对象的属性;对值进行算术、关系和逻辑运算;正则表达式匹配;集合操作