zoukankan      html  css  js  c++  java
  • Spring 学习笔记(四)—— XML配置依赖注入

      依赖注入(DI)与控制反转(IoC)是同一个概念,都是为了处理对象间的依赖关系。

      通过DI/IoC容器,相互依赖的对象由容器负责创建和装配,而不是在代码中完成。

      Spring支持通过setter方法和构造方法两种方式完成注入。


      Setter方法注入

        setter方法注入是最常见的一种注入方式。Spring先调用Bean的默认构造函数实例化Bean对象,然后通过反射的方式调用setter方法注入属性值。

        与之前的示例相同,可查看前面的笔记。


      构造方法注入

        如果Bean的属性中有一些是必须赋值的,或者对多个属性的赋值顺序有要求,则使用setter方法注入可能会造成错误。

        只能通过人为保证,而使用构造方法注入可以保证IoC容器提供的Bean实例一定是可用的。

      示例如下:

    public class Order {
        public String OrderNum;
        public int id;
        public double price;
    
        public Order(String NO,int id,double price){
            this.OrderNum=NO;
            this.id=id;
            this.price=price;
        }
    
    
    }
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
            <bean id="Order" class="Demo03.Order">
                <constructor-arg name="id" value="100"/>
                <constructor-arg name="NO" value="200"/>
                <constructor-arg name="price" value="5.7"/>
            </bean>
    </beans>

    两种注入方式的区别

      对于复杂的依赖关系,如果采用构造方式注入,会导致构造器过于臃肿,难以阅读。尤其是在某些属性可选的情况下,多参数的构造器更加笨重。

      构造方法注入可以在构造器中确定依赖关系的注入顺序,当某些属性的赋值操作是由先后顺序时,这点尤为重要。

      对于依赖关系无须变化的Bean,构造注入更有用处。


    注入值类型

      针对注入的值,Spring支持三种类型:字面值、其他Bean的引用、集合类型。

      集合支持数组(array)、List(list)、Set(set)、Map(map)、Properties(props)。

      示例:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        <bean id="book" class="Demo02.Book">
            <property name="name" value="Richard"/>
            <property name="author" value="Rekent"/>
            <property name="publisher" value="Cheung"/>
            <property name="price" value="70"/>
            <property name="order" ref="Order"/>
        </bean>
    
        <bean id="Order" class="Demo03.Order">
            <constructor-arg name="id" value="100"/>
            <constructor-arg name="NO" value="200"/>
            <constructor-arg name="price" value="5.7"/>
        </bean>
    
        <bean id="CollectionDemo" class="Demo04.CollectionDemo">
            <property name="list">
                <list>
                    <value>1</value>
                    <value>2</value>
                </list>
            </property>
    
            <property name="set">
                <set>
                    <value>1</value>
                    <value>2</value>
                </set>
            </property>
    
            <property name="map">
                <map>
                    <entry key="1" value="2"/>
                    <entry key="2" value-ref="book"/>
                </map>
            </property>
    
            <property name="properties">
                <props>
                    <prop key="1">22</prop>
                    <prop key="2">BB</prop>
                </props>
            </property>
        </bean>
    </beans>
  • 相关阅读:
    Auto.js实现自动刷视频,点赞脚本(一)
    C# 将excel文件导入到SqlServer数据库
    JavaScript实现HTML导航栏下拉菜单[悬浮显示]
    补码的知识
    指针06 零基础入门学习C语言46
    指针05 零基础入门学习C语言45
    标志寄存器01 零基础入门学习汇编语言54
    标志寄存器02 零基础入门学习汇编语言55
    标志寄存器02 零基础入门学习汇编语言55
    标志寄存器01 零基础入门学习汇编语言54
  • 原文地址:https://www.cnblogs.com/rekent/p/7234761.html
Copyright © 2011-2022 走看看