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;调用方法和访问对象的属性;对值进行算术、关系和逻辑运算;正则表达式匹配;集合操作

05-15 10:35