首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Spring 札记2-Bean的定义及范围

2012-11-03 
Spring 笔记2---Bean的定义及范围1. depends-on属性 ?? 设置依赖关系的bean,如果存在多个依赖对象,用逗号,

Spring 笔记2---Bean的定义及范围

1. depends-on属性

?? 设置依赖关系的bean,如果存在多个依赖对象,用逗号,分号或空格隔开.如

<bean id="testBean1" class=.... depends-on="testBean2,testBean3"/>

? 可以解决有特殊关系的两个或多个Bean的实例化顺序问题,假如以上代码不加入depends-on属性,就必须要求testBean2,testBean3要在testBean1之前实例化,所以定义必须在testBean1前。

<bean id="testBean2" class.../><bean id="testBean3" class.../><bean id="testBean1" class...><property name="testBean2" ref="testBean2"/><property name="testBean3" ref="testBean3"/></bean>

?这样会带来代码维护的不方便,所以最好的办法是启用depends-on。

?

2. 抽象及子Bean定义

Spring允许用显式和隐式方式申明抽象Bean。区别在于显式定义了class属性,而隐式没有。

显式:

<bean id="abstractBean1" abstract="true"/><bean id="childBean1" parent="abstractBean1"/>

?隐式:

<bean id="abstractBean1"  abstract="true"/><bean id="childBean1" parent="abstractBean1"/>

其中parent属性的声明完成了继承关系的映射。

?

同样的,可以实现“多重”的继承:

<bean id="abstractBean1" abstract="true"/><bean id="abstractBean2" parent="abstractBean1" abstract="true"/><bean id="childBean3" parent="abstractBean2"/>

?这样childBean3也就同时拥有了Bean1和Bean2的属性。

?

3. alias别名

能降低应用和受管Bean间的耦合性。

<bean id="testBean" alias="tb"/>

?也可以通过别名获得该Bean

?

ITestBean tb = (ITestBean)factory.getBean("tb");

?

4.读取配置properties文件属性

例如userinfo.properties内容如下

db.username=scottdb.password=tiger

?那么可以通过Spring的PropertyPlaceholderConfigurer实现BeanFactoryPostProcessor接口来对文件进行管理

<bean id="propertyPlaceholderConfigurer" name="code"><bean name="userinfo" class....><property name="username" value="${db.username}"/><property name="password" value="${db.password}"/></bean

?

*Spring已经提供了<context:property-placeholder/>元素来代替配置PropertyPlaceholderConfigurer对象了

?

<context:property-placeholder location="userinfo.properties"/>

?

*<context:property-override/>元素是检查properties中是否存在需要覆盖的属性致,有则替换覆盖,没有则保留受管Bean中的对应属性。

<context:property-override location="ui.properties"/><bean name="userInfo" class...><property name="username" value="un"/><property name="password" value="pw"/></bean>


5. 受管Bean的作用范围

singleton? 默认的 <bean/>定义

prototype DI容器不会主动实例化prototype受管Bean

request

session

globalSession

?

*lazy-init="true" 并不意味着构造IOC容器时这一个<bean/>不会被实例化,因为如果BeanA需要引用BeanB,A未启用延迟加载,而B启用了。当容器在完成A实例化时,容器发现它引用了B,因此容器会马上实例化B.无论B是否设定了延迟加载,只要A需要它,容器就会毫不犹豫的去完成B的实例化。

热点排行