Spring 配置Bean

Spring的3中依赖注入方式
  
 1.属性注入
    2.构造器注入
    3.工厂方法注入(很少使用,不推荐)

属性注入:
    即通过setter方法注入bean的属性值
    属性注入使用 <property> 元素, 使用 name 属性指定 Bean 的属性名称,value 属性或 <value> 子节点指定属性值     

<!-- 配置bean class:bean的全类名,通过反射的方式在IOC容器中创建Bean,所以要求Bean中必须要有无参数的构造器 id:标识容器的bean,id唯一 -->
    <bean id="helloWorld" class="cn.junhui.bean.test.HelloWorld">
        <property name="name2" value="Spring"></property>
        <!-- name的属性值对应的是set方法 value值是 把这个值传入那个set方法中 -->
    </bean>

构造器注入:
    通过构造方法注入Bean 的属性值或依赖的对象,它保证了 Bean 实例在实例化后就可以使用。
构造器注入在 <constructor-arg> 元素里声明属性, <constructor-arg> 中没有 name 属性,但是有value子节点去配置

    <!--通过构造方法配置bean的属性 索引和类型可以混合使用 -->
    <bean id="car1" class="cn.junhui.bean.test.Car">
        <constructor-arg value="Audi" index="0"></constructor-arg>
        <constructor-arg value="shanghai" index="1"></constructor-arg>
        <constructor-arg value="300000" type="int"></constructor-arg>
    </bean>

引用其他bean
    组成应用程序的 Bean 经常需要相互协作以完成应用程序的功能. 要使 Bean 能够相互访问, 就必须在 Bean 配置文件中指定对 Bean 的引用
    在 Bean 的配置文件中, 可以通过 <ref> 元素或 ref  属性为 Bean 的属性或构造器参数指定对 Bean 的引用. 
    也可以在属性或构造器里包含 Bean 的声明, 这样的 Bean 称为内部 Bean(跟内部类很相似)

集合属性:
    在 Spring中可以通过一组内置的 xml 标签(例如: <list>, <set> 或 <map>) 来配置集合属性.
    配置 java.util.List 类型的属性, 需要指定 <list>  标签, 在标签里包含一些元素. 这些标签可以通过 <value> 指定简单的常量值, 通过 <ref> 指定对其他 Bean 的引用. 通过<bean> 指定内置 Bean 定义. 通过 <null/> 指定空元素. 甚至可以内嵌其他集合.
  

 数组的定义和 List 一样, 都使用 <list>
    配置 java.util.Set 需要使用 <set> 标签, 定义元素的方法与 List 一样.

    <!-- 为集合属性赋值  list-->
    <bean id = "carList" class="cn.junhui.test.Person">
        <property name="name" value="junhui"></property>
        <property name="age" value="25"></property>
        <property name="carlist">
            <list>
                <ref bean = "car1"/>
                <ref bean = "car2"/>
            </list>
        </property>
    </bean>


   配置properties 
        Properties 继承于 Hashtable.表示一个持久的属性集.属性列表中每个键及其对应值都是一个字符串。
    <bean id="dataSource" class="cn.junhui.test.DataSource">
        <property name="pro">
            <props>
                <prop key="user">root</prop>
                <prop key="pwd">123456</prop>
                <prop key="age">25</prop>
            </props>
        </property>
    </bean>

自动装配:
    Spring IOC 容器可以自动装配 Bean. 需要做的仅仅是在 <bean> 的 autowire 属性里指定自动装配的模式
    byType(根据类型自动装配): 若 IOC 容器中有多个与目标 Bean 类型一致的 Bean. 在这种情况下, Spring 将无法判定哪个 Bean 最合适该属性, 所以不能执行自动装配.
    byName(根据名称自动装配): 必须将目标 Bean 的名称和属性名设置的完全相同.
    constructor(通过构造器自动装配): 当 Bean 中存在多个构造器时, 此种自动装配方式将会很复杂. 不推荐使用

    缺点:
        在 Bean 配置文件里设置 autowire 属性进行自动装配将会装配 Bean 的所有属性. 然而, 若只希望装配个别属性时, autowire 属性就不够灵活了. 
    autowire 属性要么根据类型自动装配, 要么根据名称自动装配, 不能两者兼而有之.
    一般情况下,在实际的项目中很少使用自动装配功能,因为和自动装配功能所带来的好处比起来,明确清晰的配置文档更有说服力一些

Bean之间的关系

继承(与java之间的继承不一样),依赖

继承:Spring 允许继承 bean 的配置, 被继承的 bean 称为父 bean. 继承这个父 Bean 的 Bean 称为子 Bean
        子 Bean 从父 Bean 中继承配置, 包括 Bean 的属性配置
        子 Bean 也可以覆盖从父 Bean 继承过来的配置
        父 Bean 可以作为配置模板, 也可以作为 Bean 实例. 若只想把父 Bean 作为模板, 可以设置 <bean> 的abstract 属性为 true, 这样 Spring 将不会实例化这个 Bean
        并不是 <bean> 元素里的所有属性都会被继承. 比如: autowire, abstract 等.
        也可以忽略父 Bean 的 class 属性, 让子 Bean 指定自己的类, 而共享相同的属性配置. 但此时 abstract 必须设为 true


            <bean id="car1" class="cn.junhui.bean.test.Car">
                <constructor-arg value="Audi" index="0"></constructor-arg>
                <constructor-arg value="shanghai" index="1"></constructor-arg>
                <constructor-arg value="300000" type="int"></constructor-arg>
                <!--当设置了 abstract = "true" 时,此bean不能被实例化 只能用来被继承作为模板-->
            </bean>
            <!-- 继承 car1 -->
            <bean id="car3" parent="car1" p:brand="继承的测试">
            </bean>

依赖:Spring 允许用户通过 depends-on 属性设定 Bean 前置依赖的Bean,前置依赖的 Bean 会在本 Bean 实例化之前创建好
        如果前置依赖于多个 Bean,则可以通过逗号,空格或的方式配置 Bean 的名称
            <!-- 依赖  car1-->
            <bean id="depends_person" class = "cn.junhui.bean.test.Person"
            p:name="depends" depends-on="car1">    
            </bean>

bean作用域:在 Spring 中, 可以在 <bean> 元素的 scope 属性里设置 Bean 的作用域. 
            默认情况下, Spring 只为每个在 IOC 容器里声明的 Bean 创建唯一一个实例, 整个 IOC 容器范围内都能共享该实例:所有后续的 getBean() 调用和 Bean 引用都将返回这个唯一的 Bean 实例.该作用域被称为 singleton, 它是所有 Bean 的默认作用域.

            singleton:在SpringIOC容器中仅存在一个Bean实例,Bean以单实例的方式存在。在初始化容器的时候,此实例就会被创建
            prototype:每次调用getBean()时都会返回一个新的实例。调用一次,创建一次
            request:每次HTTP请求都会创建一个新的Bean,该作用域仅适用于 WebApplicationContext 环境
            session:同一个 HTTP Session 共享一个Bean,不同的 HTTP Session 使用不同的Bean,该作用域仅适用于 WebApplicationContext 环境

使用外部属性文件进行配置:
    在配置文件里配置 Bean 时, 有时需要在 Bean 的配置里混入系统部署的细节信息(例如: 文件路径, 数据源配置信息等). 而这些部署细节实际上需要和 Bean 配置相分离
    Spring 提供了一个 PropertyPlaceholderConfigurer 的 BeanFactory 后置处理器, 这个处理器允许用户将 Bean 配置的部分内容外移到属性文件中. 可以在 Bean 配置文件里使用形式为 ${var} 的变量, PropertyPlaceholderConfigurer 从属性文件里加载属性, 并使用这些属性来替换变量.
    Spring 还允许在属性文件中使用 ${propName},以实现属性之间的相互引用。

        <!-- 导入外部属性文件 -->
    <context:property-placeholder location = "classpath:mysql.properties"/>
    
    <bean id = "mysql" class = "com.mchange.v2.c3p0.ComboPooledDataSource">
        <!-- 使用外部化属性文件的属性 -->
        <property name="user" value="${user}"></property>
        <property name="password" value="${password}"></property>
        <property name="driverClass" value="${diverClass}"></property>
        <property name="jdbcUrl" value="jdbcUrl"></property>
    </bean>

猜你喜欢

转载自blog.csdn.net/qq_37638061/article/details/81138632