spring知識二---(bean關係和作用域)

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>

源碼可以在我的資源中查看 或者 github地址
https://github.com/wangfa1994/SpringLearning/tree/spring002

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章