Spring DI依赖注入过程解析

目录
  • 依赖简介
  • 依赖注入
  • Spring DI依赖注入详解

依赖简介

一个典型的企业应用程序不是由一个单一的对象组成(或Spring的说法中的bean)。即使是最简单的应用程序也只有几个对象一起工作来呈现最终用户看作是一个连贯的应用程序。如何从定义许多独立的bean定义到完全实现的应用程序,在这些应用程序中对象协作实现目标。

依赖注入

依赖注入(DI)是一个过程,通过这个过程,对象可以通过构造函数参数,工厂方法的参数或者在构造或返回对象实例后设置的属性来定义它们的依赖关系从工厂方法。然后容器在创建bean时注入这些依赖关系。这个过程从根本上说是相反的,因此名为控制反转(IoC),它本身通过使用类的直接构造或服务定位符模式来控制它自己的依赖关系的实例化或位置。
代码与DI原则相比更加清晰,当对象提供依赖时,解耦更为有效。该对象不查找它的依赖关系,不知道依赖关系的位置或类。因此,您的类变得更容易测试,特别是当依赖关系在接口或抽象基类上时,它们允许在单元测试中使用存根或模拟实现。

DI存在两种主要的变体,基于构造函数的依赖注入和基于Setter的依赖注入

Spring DI依赖注入详解

pojo类:

public class Student {
    private String name;
    private Hello hello;
    private String[] books;
    private List<String> hobbys;
    private Map<String, String> games;
    private String wife;
    private Properties info;

	public Student() {
	}

    public Student(String name, String wife) {
        this.name = name;
        this.wife = wife;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Hello getHello() {
        return hello;
    }

    public void setHello(Hello hello) {
        this.hello = hello;
    }

    public String[] getBooks() {
        return books;
    }

    public void setBooks(String[] books) {
        this.books = books;
    }

    public List<String> getHobbys() {
        return hobbys;
    }

    public void setHobbys(List<String> hobbys) {
        this.hobbys = hobbys;
    }

    public Map<String, String> getGames() {
        return games;
    }

    public void setGames(Map<String, String> games) {
        this.games = games;
    }

    public String getWife() {
        return wife;
    }

    public void setWife(String wife) {
        this.wife = wife;
    }

    public Properties getInfo() {
        return info;
    }

    public void setInfo(Properties info) {
        this.info = info;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", hello=" + hello +
                ", books=" + Arrays.toString(books) +
                ", hobbys=" + hobbys +
                ", games=" + games +
                ", wife='" + wife + '\'' +
                ", info=" + info +
                '}';
    }
}

注入普通的String属性:

<bean id="student" class="top.imustctf.pojo.Student">
    <property name="name" value="dahe"/>
</bean>

bean注入,适用于其他的实体类:

<bean id="student" class="top.imustctf.pojo.Student">
    <property name="hello" ref="hello"/>
</bean>

数组注入:

<bean id="student" class="top.imustctf.pojo.Student">
    <property name="books">
        <array>
            <value>C语言入门到精通</value>
            <value>Spring底层原理</value>
        </array>
    </property>
</bean>

List注入:

<bean id="student" class="top.imustctf.pojo.Student">
    <property name="hobbys">
        <list>
            <value>编程</value>
            <value>美女</value>
        </list>
    </property>
</bean>

Map注入:

<bean id="student" class="top.imustctf.pojo.Student">
    <property name="games">
        <map>
            <entry key="王者荣耀" value="30级"/>
            <entry key="我的世界" value="100级"/>
        </map>
    </property>
</bean>

空值注入:

<bean id="student" class="top.imustctf.pojo.Student">
    <property name="wife">
        <null/>
    </property>
</bean>

Properties注入:

<bean id="student" class="top.imustctf.pojo.Student">
    <property name="info">
        <props>
            <prop key="学号">202099166</prop>
            <prop key="专业">软件工程</prop>
        </props>
    </property>
</bean>

p命名空间注入:

要使用p命名空间,你需要在beans配置头加入如下语句:

xmlns:p="http://www.springframework.org/schema/p"

例如:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

随后,就可以使用p方式进行注入:

<bean id="student" class="top.imustctf.pojo.Student" p:name="dahe"
          p:wife="xiaoqian"/>

c命名空间注入:

要使用c命名空间,你需要在beans配置头加入如下语句:

xmlns:c="http://www.springframework.org/schema/c"

随后,就可以使用c方式进行注入:(c命名空间是通过构造器进行注入,这就需要pojo类必须存在一个有参的构造方法)

<bean id="student" class="top.imustctf.pojo.Student" c:name="dahe"
          c:wife="xiaoqian"/>

到此这篇关于Spring DI依赖注入详解的文章就介绍到这了,更多相关Spring DI依赖注入内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Spring框架中IoC容器与DI依赖注入教程

    目录 一.Spring 是什么 1.1 什么是容器 1.2 什么是 IoC 二.理解 IoC 2.1 传统程序开发的问题 2.2 分析 2.3 控制反转式程序开发 2.4 对比总结规律 2.5 理解 Spring IoC 三.DI 概念说明 四.总结 一.Spring 是什么 我们通常所说的 Spring 指的是 Spring Framework (Spring 框架),它是⼀个开源框架,有着活跃而庞大的社区,这就是它之所以能长久不衰的原因.Spring ⽀持⼴泛的应⽤场景,它可以让 Java

  • 浅谈spring DI 依赖注入方式和区别

    目录 spring DI 3种DI注解的区别 1 @Autowired 2 @Inject 3 @Resource 3种注入方式的区别 1 field注入 2 构造器注入 3 setter注入 构造器注入的好处 1 依赖不可变 2 依赖不为空 3 完全初始化状态 4 避免循环依赖 5 总结 spring DI Spring框架对Java开发的重要性不言而喻,其核心特性就是IOC(Inversion of Control, 控制反转)和AOP,平时使用最多的就是其中的IOC,我们通过将组件交由Sp

  • 静态方法中调用Spring注入过程解析

    这篇文章主要介绍了静态方法中调用Spring注入过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 package io.yong.common.utils; import javax.annotation.PostConstruct; import io.renren.common.config.ConfigProperties; import org.springframework.beans.factory.annotation.Au

  • Spring的DI依赖注入详解

    目录 1.什么是DI依赖注入? 2.利用 set 方法给属性赋值 3.利用 构造函数 给属性赋值 总结: 1.什么是DI依赖注入? spring动态的向某个对象提供它所需要的其他对象.这一点是通过DI(Dependency Injection,依赖注入)来实现的.比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了 spring我们就只需要告诉spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道

  • Spring Boot 整合 Druid过程解析

    这篇文章主要介绍了Spring Boot 整合 Druid过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 概述 Druid 是阿里巴巴开源平台上的一个项目,整个项目由数据库连接池.插件框架和 SQL 解析器组成.该项目主要是为了扩展 JDBC 的一些限制,可以让程序员实现一些特殊的需求,比如向密钥服务请求凭证.统计 SQL 信息.SQL 性能收集.SQL 注入检查.SQL 翻译等,程序员可以通过定制来实现自己需要的功能. Druid 是

  • Spring Bean 依赖注入常见错误问题

    有时我们会使用@Value自动注入,同时也存在注入到集合.数组等复杂类型的场景.这都是方便写 bug 的场景. 1 @Value未注入预期值 在字段或方法/构造函数参数级别使用,指示带注释元素的默认值表达式. 通常用于表达式驱动或属性驱动的依赖注入. 还支持处理程序方法参数的动态解析 例如,在 Spring MVC 中,一个常见的用例是使用#{systemProperties.myProp} systemProperties.myProp #{systemProperties.myProp}样式

  • 详析Spring中依赖注入的三种方式

    前言 平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中.依赖注入的另一种说法是"控制反转",通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做. 在Sprin

  • Spring整合MyBatis图示过程解析

    这篇文章主要介绍了Spring整合MyBatis图示过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.导入所需要的jar依赖 !--MyBatis和Spring的整合包 由MyBatis提供--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <vers

  • 简单了解Spring循环依赖解决过程

    这篇文章主要介绍了简单了解Spring循环依赖解决过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 前言 说起Spring中循环依赖的解决办法,相信很多园友们都或多或少的知道一些,但当真的要详细说明的时候,可能又没法一下将它讲清楚.本文就试着尽自己所能,对此做出一个较详细的解读.另,需注意一点,下文中会出现类的实例化跟类的初始化两个短语,为怕园友迷惑,事先声明一下,本文的实例化是指刚执行完构造器将一个对象new出来,但还未填充属性值的状态,而

  • Spring Boot整合Spring Cache及Redis过程解析

    这篇文章主要介绍了Spring Boot整合Spring Cache及Redis过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.安装redis a.由于官方是没有Windows版的,所以我们需要下载微软开发的redis,网址: https://github.com/MicrosoftArchive/redis/releases b.解压后,在redis根目录打开cmd界面,输入:redis-server.exe redis.wind

随机推荐