Bean之间的关系——继承和依赖
继承
1、Spring 允许继承 bean 的配置, 被继承的 bean 称为父 bean. 继承这个父 Bean 的 Bean 称为子 Bean
子 Bean 从父 Bean 中继承配置, 包括 Bean 的属性配置。
2、子 Bean 也可以覆盖从父 Bean 继承过来的配置。
3、父 Bean 可以作为配置模板, 也可以作为 Bean 实例. 若只想把父 Bean 作为模板, 可以设置 【bean】 的abstract 属性为 true, 这样 Spring 将不会实例化这个 Bean。
4、并不是 【bean】 元素里的所有属性都会被继承. 比如: autowire, abstract 等。
5、也可以忽略父 Bean 的 class 属性, 让子 Bean 指定自己的类, 而共享相同的属性配置. 但此时 abstract 必须设为 true。
<!--父类中的bean如果使用 abstract,则不能被实例化,但是可以被继承用于其它bean
如果一个类没有指定class属性,则这个bean必须是抽象的,但是在其继承的子类中必须存在class属性
即class属性可以配置在父类上,也可以配置在子类上
-->
<bean id="address" class="com.wf.springbeanrelation.Address" abstract="true">
<property name="city" value="henan"></property>
<property name="street" value="luoyang"></property>
</bean>
<!-- 利用 parent属性指定所继承的bean,需要继承的属性不给予配置,就可以直接继承于parent-->
<bean id="address01" parent="address">
<!-- <property name="city" value="henan"></property> -->
<property name="street" value="zhengzhou"></property>
</bean>
<!-- 可以实现多重继承 -->
<bean id="address02" parent="address01">
</bean>
依赖
1、Spring 允许用户通过 depends-on 属性设定 Bean 前置依赖的Bean,前置依赖的 Bean 会在本 Bean 实例化之前创建好
2、如果前置依赖于多个 Bean,则可以通过逗号,空格或的方式配置 Bean 的名称
<!-- 依赖 -->
<bean id="car" class="com.wf.springbeanrelation.Car">
<property name="brand" value="FuTe"></property>
<property name="price" value="25100"></property>
</bean>
<!-- user这个bean依赖于car ,及要想初始化这个bean,前提是car的bean存在-->
<bean id="user" class="com.wf.springbeanrelation.User" depends-on="car">
<property name="name" value="tom"></property>
<property name="address" ref="address02"></property>
</bean>
bean的作用域
在 Spring 中, 可以在 【bean】 元素的 scope 属性里设置 Bean 的作用域.
默认情况下, Spring 只为每个在 IOC 容器里声明的 Bean 创建唯一一个实例, 整个 IOC 容器范围内都能共享该实例:所有后续的 getBean() 调用和 Bean 引用都将返回这个唯一的 Bean 实例.该作用域被称为 singleton, 它是所有 Bean 的默认作用域.
<!-- 默认形式 :单例,spring容器只创建一个实例,在容器初始化就进行创建-->
<bean id="carsing" class="com.wf.springbeanscope.Car" scope="singleton">
<property name="brand" value="FuTe"></property>
<property name="price" value="25100"></property>
</bean>
<!-- 原型形式 ,每次调用,容器都会重新生成一个实例,在初始化时不进行创建,而是在每次使用时进行创建-->
<bean id="carpro" class="com.wf.springbeanscope.Car" scope="prototype">
<property name="brand" value="FuTe"></property>
<property name="price" value="25100"></property>
</bean>
引入外部文件。
一般情况下,我们都会给数据库的配置文件配置到单独的properties文件中,然后再在总的配置文件中进行引用,这样我们可以很方便的修改我们的数据库配置,而不是找到总的配置文件打开,再去修改。
引入外部文件,我们需要在总的配置文件中,添加新的命名空间Context。
<!-- 引入新的命名空间 -->
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
<!-- 导入外部文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 利用外部引用 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
<property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
</bean>