Spring_ 依赖注入 详细讲解

2023-05-16

文章目录

  • 一、什么是依赖注入?
    • 1、类的关系
      • 1.1、 依赖关系(Dependency)
      • 1.2、聚合(Aggregation)
    • 2、关系强度
  • 二、 为什么使用依赖注入?
    • 1、开闭原则
      • 1.1、定义
      • 1.2、 开闭原则优点
    • 2、高内聚,低耦合
  • 三、 依赖注入的方式
    • 1、通过 Set 方法注入
      • 1.1、 配置文件
      • 1.2、 Bean 对象
    • 2、通过构造方法注入
      • 2.1、 配置文件
      • 2.2、 Bean 对象
    • 3、自动注入
      • 3.1、 局部自动注入
      • 3.2、 全局自动注入
  • 四、 依赖注入的数据类型
    • 1、注入 Bean 对象
    • 2、注入基本数据类型和字符串
    • 3、注入 List
    • 4、注入 Set
    • 5、注入 Map
    • 6、注入 Properties


一、什么是依赖注入?

DI (Dependency Injection):依赖注入是指在 Spring IOC 容器创建对象的过程中,将所依赖的对象通过配置进行注入。我们可以通过依赖注入的方式来降低对象间的耦合度。
在软件工程中,对象之间的耦合度就是对象之间的依赖性。对象之间的耦合越高,维护成本越高,因此对象的设计应使对象之间的耦合越小越好。
对于 Spring IOC 容器而言我们更多的是使用它的依赖注入。 Spring 创建对象的过程叫做 IOC,创建对象时给对象属性赋值叫做 DI,所以我们可以认为 IOC 和 DI 是同一个事情。

1、类的关系

继承 实现 依赖 关联 聚合 组合

1.1、 依赖关系(Dependency)

【依赖关系】:是一种使用的关系, 即一个类的实现需要另一个类的协助, 所以要尽量不使用双向的互相依赖
【代码表现】:局部变量、方法的参数或者对静态方法的调用
【箭头及指向】:带箭头的虚线,指向被使用者

1.2、聚合(Aggregation)

【聚合关系】:是整体与部分的关系.如车和轮胎是整体和部分的关系. 聚合关系是关联关系的一种,是强的关联关系;关联和聚合在语法上无法区分,必须考察具体的逻辑关系。
【代码体现】:成员变量
【箭头及指向】:带空心菱形的实心线,菱形指向整体

2、关系强度

继承 = 实现 > 组合 > 聚合 > 关联 > 依赖

二、 为什么使用依赖注入?

1、开闭原则

1.1、定义

OCP (Open Close Principle): 软件本身应该是可扩展的,而不可修改的。也就是,对扩展开放,对修改封闭的。

1.2、 开闭原则优点

易扩展。开闭原则的定义就要求对扩展开放。
易维护。软件开发中,对现有代码的修改是一件很有风险的事情,符合开闭原则的设计在扩展时无需修改现有代码,规避了这个风险,大大提交了可维护性。

2、高内聚,低耦合

高内聚是指相关度比较高的部分尽可能的集中,不要分散。
低耦合就是说两个相关的模块尽可以能把依赖的部分降低到最小,不要产生强依赖。

三、 依赖注入的方式

在使用依赖注入时,如果注入的是 Bean 对象,那么要求注入的 Bean 对象与被注入的 Bean 对象都需要 Spring IOC 容器来实例化。

1、通过 Set 方法注入

需要为注入的成员变量提供 Set 方法。

1.1、 配置文件

 <bean id="usersDao" class="com.bjsxt.dao.impl.UsersDaoImpl"/>
    <bean id="usersDaoMybatis" class="com.bjsxt.dao.impl.UsersDaoMybatisImpl"/>
    <bean id="usersService" name="name1,name2,name3" class="com.bjsxt.service.impl.UsersServiceImpl">
        <property name="usersDao">
            <ref bean="usersDaoMybatis"/>
        </property>
    </bean>

1.2、 Bean 对象

public class UsersServiceImpl implements UsersService {
    private UsersDao usersDao;

    public UsersDao getUsersDao() {
        return usersDao;
    }

    public void setUsersDao(UsersDao usersDao) {
        this.usersDao = usersDao;
    }

    public UsersServiceImpl(){
        System.out.println("Init.......");
    }

    @Override
    public void addUsers() {
        usersDao.insertUsers();
        //System.out.println("UsersService addUsers .....");
    }
}

2、通过构造方法注入

Bean 对象中需要提供有参的构造方法

2.1、 配置文件

    <bean id="usersDao" class="com.bjsxt.dao.impl.UsersDaoImpl"/>
    <bean id="usersDaoMybatis" class="com.bjsxt.dao.impl.UsersDaoMybatisImpl"/>
    <bean id="usersService" name="name1,name2,name3" class="com.bjsxt.service.impl.UsersServiceImpl">
<!--        通过set方式注入-->
<!--        <property name="usersDao">-->
<!--            <ref bean="usersDaoMybatis"/>-->
<!--        </property>-->

<!--        通过构造方法注入-->
<!--        name:根据参数名称识别参数
            index:根据参数位置识别参数
            type:根据参数类型识别参数-->
        <constructor-arg name="usersDao" ref="usersDaoMybatis"/>
    </bean>

2.2、 Bean 对象

    private UsersDao usersDao;

    public UsersServiceImpl(UsersDao usersDao){
        this.usersDao = usersDao;
    }

3、自动注入

自动注入的方式有两种,一种是全局配置自动注入,另一种是局部配置自动注入
无论全局配置或局部单独配置,都有 5 个值可以选择:
no:当 autowire 设置为 no 的时候,Spring 就不会进行自动注入。
byName:在 Spring 容器中查找 id 与属性名相同的 bean,并进行注入。需要提供 set 方法。
byType:在 Spring 容器中查找类型与属性名的类型相同的 bean,并进行注入。需要提供 set 方法。
constructor:仍旧是使用 byName 方式,只不过注入的时候,使用构造方式进行注入。
default:全局配置的 default 相当于 no,局部的 default 表示使用全局配置设置。

3.1、 局部自动注入

通过 bean 标签中的 autowier 属性配置自动注入。
有效范围:仅针对当前 bean 标签生效。

    <bean id="usersDaoMybatis" class="com.bjsxt.dao.impl.UsersDaoMybatisImpl"/>
    <bean id="usersService" name="name1,name2,name3" class="com.bjsxt.service.impl.UsersServiceImpl" autowire="byType">
    </bean>

3.2、 全局自动注入

通过 beans 标签中的 default-autowire 属性配置自动注入。
有效范围:配置文件中的所有 bean 标签都生效。

<?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" default-autowire="byType">

四、 依赖注入的数据类型

1、注入 Bean 对象

方式一:

<property name="FieldName">
	<ref bean="BeanID"/>
</property>

方式二:

<property name="FieldName" ref="BeanID"/>

2、注入基本数据类型和字符串

  • 方式一:
<property name="FieldName">
	<value>content</value>
</property>
  • 方式二:
<property name="FieldName" value="Content"/>

测试代码:

    private UsersDao usersDao;
    private String username;
    private int userage;

·············································································

    <bean id="usersService" name="name1,name2,name3" class="com.bjsxt.service.impl.UsersServiceImpl" >
        <property name="usersDao" ref="usersDao"/>
        <property name="username" value="Corey"/>
        <property name="userage" value="20"/>
    </bean>

3、注入 List

<property name="FieldName" >
<list>
<value/>或者<bean/>或者<ref/>......
</list>
</property>

测试代码:

    private List<String> list;
    private List<Users> users;

················································

        <property name="list">
            <list>
                <value>value1</value>
                <value>value2</value>
            </list>
        </property>
        <property name="users">
            <list>
                <bean class="com.bjsxt.pojo.Users">
                    <property name="username" value="Corey"/>
                    <property name="userage" value="20"/>
                </bean>
                <bean class="com.bjsxt.pojo.Users">
                    <property name="username" value="admin"/>
                    <property name="userage" value="20"/>
                </bean>
            </list>
        </property>

4、注入 Set

<property name="FieldName" >
<set>
<value/>或者<bean/>或者<ref/>......
</set>
</property>

测试代码:

    private Set<Users> usersSet;
    

··········································

        <property name="usersSet">
            <set>
                <bean class="com.bjsxt.pojo.Users">
                    <property name="username" value="Corey-set"/>
                    <property name="userage" value="20"/>
                </bean>
                <bean class="com.bjsxt.pojo.Users">
                    <property name="username" value="admin-set"/>
                    <property name="userage" value="20"/>
                </bean>
            </set>
        </property>

5、注入 Map

  • 方式一:
<property name="FieldName" >
<map>
<entry key="KeyName" value="Content"/>
</map>
</property>

测试代码:

    private Map<String,String> map;

···············································

        <property name="map">
            <map>
                <entry key="key1" value="value1"/>
                <entry key="key2" value="value2"/>
            </map>
        </property>
  • 方式二:
<bean id="users1" class="......">
<bean id="users1" class="......">
<property name="FieldName">
<map>
<entry key="key1" value-ref="users1"/>
<entry key="key2" value-ref="users2"/>
</map>
</property>

测试代码:

    private Map<String,Users> usersMap;

·························································

        <property name="usersMap">
            <map>
                <entry key="users1" value-ref="users1"/>
                <entry key="users2" value-ref="users2"/>
            </map>
        </property>
    </bean>
    <bean id="users1" class="com.bjsxt.pojo.Users">
        <property name="username" value="Corey-map"/>
        <property name="userage" value="20"/>
    </bean>
    <bean id="users2" class="com.bjsxt.pojo.Users">
        <property name="username" value="admin-map"/>
        <property name="userage" value="20"/>
    </bean>

6、注入 Properties

<property name="FieldName" >
<props>
<prop key="KeyName">Content</prop>
</props>
</property>

测试代码:

    private Properties properties;

···········································

        <property name="properties">
            <props>
                <prop key="pro1">provalue1</prop>
                <prop key="pro2">provalue2</prop>
            </props>
        </property>

结束!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring_ 依赖注入 详细讲解 的相关文章

随机推荐

  • 监控zabbix面试题

    目录 1 我们可以用zabbix监控哪些 2 zabbix的主动监控与被动监控 3 Zabbix监控做过哪些 4 zabbix监控mysql的四大性能指标 5 配置zabbix自定义监控流程 6 安全组是什么 xff0c 限制了3306的入
  • 系统运维面试题

    目录 1 什么是运维 什么是游戏运维 2 在工作中 xff0c 运维人员经常需要跟运营人员打交道 xff0c 请问运营人员是做什么工作的 xff1f 3 请描述下linux 系统的开机启动过程 4 为什么连接的时候是三次握手 xff0c 关
  • Xshell的使用

    本文修改于 xff1a 高效使用XSHELL 简书 jianshu com https www jianshu com p 67b83d3f2e40 一 XShell的概述 1 XSHELL是什么 Xshell是用于Windows平台的功能
  • linux下解压rar和7z压缩文件

    在windows下我们压缩解压文件通常后缀为rar xff0c 在linux下我们压缩解压文件通常后缀为tar 默认在linux下我们不能解压压缩rar文件 我们可以下载rarlinux安装包实现解压压缩后缀为rar的包 下载地址 xff1
  • go语言,简单分析和了解

    Go 本地化 该指南也有其他语言版本 xff1a Brazilian Portuguese Portugu s do BrasilCatalan Catal Spanish Espa olFrench Fran aisHebrew Japa
  • Filebeat输出json格式的日志并指定message字段的值

    目录 1 开启json格式所需的字段概述 2 配置示例 3 如果问题没有解决可点击官网 1 开启json格式所需的字段概述 filebeat配置input要有以下字段 json keys under root true json overw
  • Prometheus添加邮件告警和企业微信机器人告警

    我们将在 Prometheus 服务器上编写警报规则 xff0c 这些规则将使用我们收集的指标并在指定的阈值或标准上触发警报 xff0c 收到警报后 xff0c Alertmanager 会处理警报并根据其标签进行路由 一旦路径确定 xff
  • docker部署简易Prometheus

    注 xff1a 部署前可以先系统的学习一下 xff1a Introduction Prometheus中文技术文档 在之后需要书写自定义告警的 xff0c 需要在学习一下PromQL语言 xff0c 一般网上也能搜到 xff0c 可以在安装
  • k8s面试题-进阶

    1 简述etcd及其特点 etcd是CoreOS团队发起的开源项目 xff0c 是一个管理配置信息和服务发现 xff08 service discovery xff09 的项目 xff0c 它的目标是构建一个高可用的分布式键值 xff08
  • 制作Alpine Linux镜像报错errors: 15 distinct packages available

    1 执行报错 执行docker build t 镜像 版本 f Dockerfile 报错 xff1a 2 查看网上的解决思路 网上文档解决思路 xff1a 这边我做了一下改变把这些写入了dockerfile 加了几个RUN RUN rm
  • 如何确定 Python 变量的类型?

    问 xff1a 如何查看变量的类型 xff1f xff08 例如无符号 32 位 xff09 答1 huntsbot com聚合了超过10 43 全球外包任务平台的外包需求 xff0c 寻找外包任务与机会变的简单与高效 使用 type 内置
  • arch linux 登录普通用户显示 "Login incorrect"

    创建用户时指定了 shell xff0c 但是指定 shell 不存在 用 root 登录查看有哪些 shell chsh l 或 span class token function cat span etc shells 用编辑器打开 e
  • 生产者消费者模型

    什么是生产者消费者模型 xff1f span class token variable 生产者和消费是操作系统中一种重要的模型 xff0c 它描述的是一种等待和通知的机制 span 一 概念引入 日常生活中 xff0c 每当我们缺少某些生活
  • Mariadb-Mysql服务器

    1 安装服务 root 64 ftp2 yum install y mariadb 2 启动服务 root 64 ftp2 systemctl start mariadb 3 进入Mysql 因为默认进入Mysql是不需要密码的 xff0c
  • Vmware批量开关机脚本

    运行Windows脚本批量开关Vmware虚拟机 1 vmrun T ws start opt VMware win2k8r2 vmx nogui启动无图形界面虚拟机 xff08 T 是区分宿主机的类型 xff0c ws server se
  • linux下proxy设定的一般方法

    在linux下配置测试环境时 xff0c 经常遇到代理服务器配置的相关问题 xff0c 在这里总结一些 xff0c 为以后节省些时间 也希望对需要的人有所帮助 linux下proxy的常规设置 一般是把如下环境变量的设置放到 etc pro
  • 计算机视觉中的论文常见单词总结

    前言 本文对计算机视觉论文中常出现的单词进行了汇总 xff0c 对于不具备直接阅读英文文献的读者 xff0c 可以考虑把这些单词给背了 之前的文章 计算机视觉中的高效阅读论文的方法总结 中提到了如何掌握阅读英文文献的能力 xff0c 我就是
  • android常见面试题与我自己的回答 (二)

    1 xff0c android process 解决访问SharedPreferences xff0c 不在同一进程 private SharedPreferencesDB Context cxt this context 61 cxt C
  • 解决打开Chrome出现 输入密码以解锁您的登录密钥环

    问题是这样的 xff0c 打开Chrome 后出现如下所示 xff1a xff08 图是网上找的 xff0c 我电脑上解决了这个问题 xff0c 这图就出现不了了 xff09 我的具体情况是 xff0c 输入什么密码都解不开 xff0c 也
  • Spring_ 依赖注入 详细讲解

    文章目录 一 什么是依赖注入 xff1f 1 类的关系1 1 依赖关系 xff08 Dependency xff09 1 2 聚合 xff08 Aggregation xff09 2 关系强度 二 为什么使用依赖注入 xff1f 1 开闭原