Spring知识点(三)bean的高级配置

目录

 

1、配置信息的继承

2、bean之间的依赖

3、bean的作用域

4、bean的生命周期

5、引用外部属性文件


1、配置信息的继承

①背景

查看下面两个Employee的配置,其中dept属性是重复的。

<bean id="dept" class="com.chengxiaoxiong.parent.bean.Department">

    <property name="deptId" value="100"/>

    <property name="deptName" value="IT"/>

</bean>

 

<bean id="emp01" class="com.chengxiaoxiong.parent.bean.Employee">

    <property name="empId" value="1001"/>

    <property name="empName" value="Tom"/>

    <property name="age" value="20"/>

 

    <!-- 重复的属性值 --> 

    <property name="detp" ref="dept"/>

</bean>

 

<bean id="emp02" class="com.chengxiaoxiong.parent.bean.Employee">

    <property name="empId" value="1002"/>

    <property name="empName" value="Jerry"/>

    <property name="age" value="25"/>

 

    <!-- 重复的属性值 -->

    <property name="detp" ref="dept"/>

</bean>

 

②配置信息的继承

<!-- emp01作为父bean,继承后可以省略公共属性值的配置 -->

<bean id="emp02" parent="emp01">

    <property name="empId" value="1002"/>

    <property name="empName" value="Jerry"/>

    <property name="age" value="25"/>

</bean>

Spring允许继承bean的配置,被继承的bean称为父bean。继承这个父bean的bean称为子bean

子bean从父bean中继承配置,包括bean的属性配置

子bean也可以覆盖从父bean继承过来的配置

 

③补充说明

父bean可以作为配置模板,也可以作为bean实例。若只想把父bean作为模板,可以设置<bean>的abstract 属性为true,这样Spring将不会实例化这个bean

如果一个bean的class属性没有指定,则必须是抽象bean

并不是<bean>元素里的所有属性都会被继承。比如:autowire,abstract等。

也可以忽略父bean的class属性,让子bean指定自己的类,而共享相同的属性配置。但此时abstract必须设为true。

 

2、bean之间的依赖

有的时候创建一个bean的时候需要保证另外一个bean也被创建,这时我们称前面的bean对后面的bean有依赖。例如:要求创建Employee对象的时候必须创建Department。这里需要注意的是依赖关系不等于引用关系,Employee即使依赖Department也可以不引用它。

<bean id="emp03" class="com.chengxiaoxiong.parent.bean.Employee" depends-on="dept">

    <property name="empId" value="1003"/>

    <property name="empName" value="Kate"/>

    <property name="age" value="21"/>

</bean>

3、bean的作用域

在Spring中,可以在<bean>元素的scope属性里设置bean的作用域,以决定这个bean是单实例的还是多实例的。

默认情况下,Spring只为每个在IOC容器里声明的bean创建唯一一个实例,整个IOC容器范围内都能共享该实例:所有后续的getBean()调用和bean引用都将返回这个唯一的bean实例。该作用域被称为singleton,它是所有bean的默认作用域。

当bean的作用域为单例时,Spring会在IOC容器对象创建时就创建bean的对象实例。而当bean的作用域为prototype时,IOC容器在获取bean的实例时创建bean的实例对象。

 

4、bean的生命周期

①Spring IOC容器可以管理bean的生命周期,Spring允许在bean生命周期内特定的时间点执行指定的任务。

②Spring IOC容器对bean的生命周期进行管理的过程:

[1]通过构造器或工厂方法创建bean实例

[2]为bean的属性设置值和对其他bean的引用

[3]调用bean的初始化方法

[4]bean可以使用了

[5]当容器关闭时,调用bean的销毁方法

③在配置bean时,通过init-method和destroy-method 属性为bean指定初始化和销毁方法

④bean的后置处理器

[1]bean后置处理器允许在调用初始化方法前后对bean进行额外的处理

[2]bean后置处理器对IOC容器里的所有bean实例逐一处理,而非单一实例。其典型应用是:检查bean属性的正确性或根据特定的标准更改bean的属性。

[3] bean后置处理器时需要实现接口:org.springframework.beans.factory.config.BeanPostProcessor。在初始化方法被调用前后,Spring将把每个bean实例分别传递给上述接口的以下两个方法:

●postProcessBeforeInitialization(Object, String)

●postProcessAfterInitialization(Object, String)

 ⑤添加bean后置处理器后bean的生命周期

[1]通过构造器或工厂方法创建bean实例

[2]为bean的属性设置值和对其他bean的引用

[3]将bean实例传递给bean后置处理器的postProcessBeforeInitialization()方法

[4]调用bean的初始化方法

[5]将bean实例传递给bean后置处理器的postProcessAfterInitialization()方法

[6]bean可以使用了

[7]当容器关闭时调用bean的销毁方法

5、引用外部属性文件

当bean的配置信息逐渐增多时,查找和修改一些bean的配置信息就变得愈加困难。这时可以将一部分信息提取到bean配置文件的外部,以properties格式的属性文件保存起来,同时在bean的配置文件中引用properties属性文件中的内容,从而实现一部分属性值在发生变化时仅修改properties属性文件即可。这种技术多用于连接数据库的基本信息的配置。

①直接配置

<!-- 直接配置 -->

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

    <property name="user" value="root"/>

    <property name="password" value="root"/>

    <property name="jdbcUrl" value="jdbc:mysql:///test"/>

    <property name="driverClass" value="com.mysql.jdbc.Driver"/>

</bean>

 

②创建properties属性文件

prop.userName=root

prop.password=root

prop.url=jdbc:mysql:///test

prop.driverClass=com.mysql.jdbc.Driver

 

③引入context名称空间

 

④指定properties属性文件的位置

<!-- 指定properties属性文件的位置 -->

<!-- classpath:xxx 表示属性文件位于类路径下 -->

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

 

⑤从properties属性文件中引入属性值

<!-- properties属性文件中引入属性值 -->

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

    <property name="user" value="${prop.userName}"/>

    <property name="password" value="${prop.password}"/>

    <property name="jdbcUrl" value="${prop.url}"/>

    <property name="driverClass" value="${prop.driverClass}"/>

</bean>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值