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>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏爱撒谎的男孩

Struts2之获取请求参数

35560
来自专栏雪地二货笔记库

如何在JSP中格式化时间

在将后台数据传回前台的时候直接传输date属性的变量不进行格式化就会产生这种情况。 若是使用的是jsp则可以使用专门进行格式化的JSTL标签。 <%@ tag...

41720
来自专栏Java帮帮-微信公众号-技术文章全总结

Java设计模式-模板方式模式

模板方法模式: 定义一个操作中的算法的骨架, 而将一些步骤延迟到子类中. 模板方法使得子类可以在不改变一个算法的结构的前提下重定义该算法的某些特定步骤. ? ...

51180
来自专栏Java学习网

Java Web中JSP中6种动作概况知识点总结——每日一语法学习

JSP动作利用XML语法格式的标记来控制Servlet引擎的行为。利用JSP动作可以动态地插入文件、重用JavaBean组件、把用户重定向到另外的页面、为Jav...

38740
来自专栏云瓣

解读 IoC 框架 InversifyJS

InversityJS 是一个 IoC 框架。IoC(Inversion of Control) 包括依赖注入(Dependency Injection) 和依...

11720
来自专栏java初学

spring框架(1)— 依赖注入

476120
来自专栏Fundebug

JavaScript异步编程史:回调函数到Promise到Async/Await

摘要: 异步编程时JavaScript以及Node.js的一大亮点,其中有什么心酸的黑历史呢?

17650
来自专栏C/C++基础

获取C++类成员虚函数地址

[1]print address of virtual member function [2]动态联编实现原理分析

11310
来自专栏zhisheng

Lombok 看这篇就够了

前提 自从进公司实习后,项目代码中能用 Lombok 的都用了,毕竟这么好的轮子要充分利用好。也可以减少一些 get/set/toString 方法的编写,虽说...

37690
来自专栏刘望舒

Groovy快速入门看这篇就够了

在前面我们学习了为什么现在要用Gradle?和Gradle入门前奏两篇文章,对Gradle也有了大概的了解,这篇文章我们接着来学习Groovy的基础,要想学好G...

32240

扫码关注云+社区

领取腾讯云代金券