SSM框架学习-DI依赖注入方式实例

news2025/2/23 19:05:19

DI依赖注入:依赖注入(Dependency Injection, DI)是一种设计模式,用于将一个对象所需要的其他对象的引用或依赖关系从代码中解耦出来,将其交由某个第三方来管理,使得对象本身更加独立,便于测试和维护。
在实际开发中,通常通过构造函数、工厂方法、属性赋值等方式将依赖关系注入到对象中,这些依赖对象(Bean)通常由IoC容器统一管理,根据配置文件自动装配并注入到需要依赖的对象中。

1. setter注入方式

这种注入方式,是要提供set方法的

在这里插入图片描述

1.1 引用类型

在这里插入图片描述

setter注入需要提供要注入对象的set方法

public class BookServiceImpl implements BookService{
    private BookDao bookDao;
    private UserDao userDao;
    //setter注入需要提供要注入对象的set方法
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
    //setter注入需要提供要注入对象的set方法
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }

    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
        userDao.save();
    }
}

xml配置文件

    <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>

    <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>

    <!--注入引用类型-->
    <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
        <!--property标签:设置注入属性-->
        <!--name属性:设置注入的属性名,实际是set方法对应的名称-->
        <!--ref属性:设置注入引用类型bean的id或name-->
        <property name="bookDao" ref="bookDao"/>
        <property name="userDao" ref="userDao"/>
    </bean>

1.2 简单(基本)类型

public class BookDaoImpl implements BookDao {

    private String databaseName;
    private int connectionNum;
    //setter注入需要提供要注入对象的set方法
    public void setConnectionNum(int connectionNum) {
        this.connectionNum = connectionNum;
    }
    //setter注入需要提供要注入对象的set方法
    public void setDatabaseName(String databaseName) {
        this.databaseName = databaseName;
    }

    public void save() {
        System.out.println("book dao save ..."+databaseName+","+connectionNum);
    }
}

xml配置文件,将bookDao的bean修改一下

    <!--注入简单类型-->
    <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
        <!--property标签:设置注入属性-->
        <!--name属性:设置注入的属性名,实际是set方法对应的名称-->
        <!--value属性:设置注入简单类型数据值-->
        <property name="connectionNum" value="100"/>
        <property name="databaseName" value="mysql"/>
    </bean>

2. 构造器注入方式

不需要set方法,写构造方法即可

2.1 引用类型


    <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
    <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>

    <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
        <!-- name:形参名称 -->
        <constructor-arg name="userDao" ref="userDao"/>
        <constructor-arg name="bookDao" ref="bookDao"/>
    </bean>
public class BookServiceImpl implements BookService{
    private BookDao bookDao;
    private UserDao userDao;

    public BookServiceImpl(BookDao bookDao, UserDao userDao) {
        this.bookDao = bookDao;
        this.userDao = userDao;
    }

    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
        userDao.save();
    }
}

2.2 简单(基本)类型

提供变量的set方法

形参名称问题

修改bookDao的Bean
设置name值存在耦合问题,当bookDao的实现类中的构造方法的形参名改了,那在xml文件同样需要修改
所以这里采用type属性,解决耦合问题

    解决形参名称的问题,与形参名不耦合
    <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
        根据构造方法参数类型注入
        <constructor-arg type="int" value="10"/>
        <constructor-arg type="java.lang.String" value="mysql"/>
    </bean>
    <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>

    <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
        <constructor-arg name="userDao" ref="userDao"/>
        <constructor-arg name="bookDao" ref="bookDao"/>
    </bean>

形参类型重复问题

    <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
        <!--根据构造方法参数位置注入-->
        <constructor-arg index="0" value="mysql"/>
        <constructor-arg index="1" value="100"/>
    </bean>
    <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>

    <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
        <!-- name:形参名称 -->
        <constructor-arg name="userDao" ref="userDao"/>
        <constructor-arg name="bookDao" ref="bookDao"/>
    </bean>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注入方式的选择
在这里插入图片描述

3. 依赖自动装配

在这里插入图片描述

同样的在实现类中,依然要写set方法

public class BookServiceImpl implements BookService{
    private BookDao bookDao;

    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }

    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }
}

但是在xml文件,修改bookservice的bean,设置autowire,通过类型自动装配,要求类型唯一(实现类唯一)

<bean class="com.itheima.dao.impl.BookDaoImpl"/>
<!--autowire属性:开启自动装配,通常使用按类型装配-->
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" autowire="byType"/>

在这里插入图片描述
在这里插入图片描述

4. 集合注入

public class BookDaoImpl implements BookDao {

    private int[] array;

    private List<String> list;

    private Set<String> set;

    private Map<String,String> map;
    
    private Properties properties;

    public void setArray(int[] array) {
        this.array = array;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public void setSet(Set<String> set) {
        this.set = set;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    public void setProperties(Properties properties) {
        this.properties = properties;
    }

    public void save() {
        System.out.println("book dao save ...");

        System.out.println("遍历数组:" + Arrays.toString(array));

        System.out.println("遍历List" + list);

        System.out.println("遍历Set" + set);

        System.out.println("遍历Map" + map);

        System.out.println("遍历Properties" + properties);
    }
}
    <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
        <!--数组注入-->
        <property name="array">
            <array>
                <value>100</value>
                <value>200</value>
                <value>300</value>
            </array>
        </property>
        <!--list集合注入-->
        <property name="list">
            <list>
                <value>itcast</value>
                <value>itheima</value>
                <value>boxuegu</value>
                <value>chuanzhihui</value>
            </list>
        </property>
        <!--set集合注入-->
        <property name="set">
            <set>
                <value>itcast</value>
                <value>itheima</value>
                <value>boxuegu</value>
                <value>boxuegu</value>
            </set>
        </property>
        <!--map集合注入-->
        <property name="map">
            <map>
                <entry key="country" value="china"/>
                <entry key="province" value="henan"/>
                <entry key="city" value="kaifeng"/>
            </map>
        </property>
        <!--Properties注入-->
        <property name="properties">
            <props>
                <prop key="country">china</prop>
                <prop key="province">henan</prop>
                <prop key="city">kaifeng</prop>
            </props>
        </property>
    </bean>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/507185.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用读写锁提高并发

我们想要的是&#xff1a;允许多个线程同时读&#xff0c;但只要有一个线程在写&#xff0c;其他线程就必须等待。 ReadWriteLock ReadWriteLock的作用&#xff1a; 只允许一个线程写入&#xff08;其他线程既不能写入也不能读取&#xff09;&#xff1b;没有写入时&#xf…

基于深度学习的三维重建网络PatchMatchNet(三):如何利用patchmatchnet完成自己场景的数据集制作与利用自己的数据完成三维重建工作

目录 1.如何使用本篇博客 1.1 patchmatchnet网络环境配置 1.2 colmap环境配置 2.如何利用colmap制作自己的三维重建数据集 2.1 采集数据 2.2 使用colmap计算位姿 2.3 转换位姿到MVS读取的格式 2.4 剔除离群图片 2.5 运用patchmatchnet进行三维重建 1.如何使用本篇博客 …

【MySQL】简单使用

数据库&#xff1a;文件&#xff0c;管理系统 类别&#xff1a;关系型&#xff0c;非关系型&#xff08;nosql&#xff09; C/S模式&#xff08;客户端服务器&#xff09; mysql登录 用户名&密码 默认管理员&#xff1a;root 登录&#xff1a;Linux管理员身份运行客户…

为什么二极管具有单向导通性

大家都知道二极管具有单向导通性&#xff0c;比如一个双极性的信号通过二极管后会变成一个单极性的信号。 为了弄清这个问题先来看一下二极管的构成。 在纯净的硅晶体中掺入五价元素&#xff0c;比如磷&#xff0c;就形成了N型半导体&#xff0c;掺入的五价元素多余的电子很容…

汉明码简单计算方法

正算 看一张图 其中标绿底色的为汉明码校验位&#xff0c;可以发现&#xff0c;这些位置的2进制里面只有一个1&#xff0c;其他位上都是0。 先说结论&#xff1a;校验位上的1在第几个位上&#xff0c;就会用来保证位置的2进制里面该位上为1的位置上的1的个数为偶数。 比如&…

11_Uboot启动流程_3

目录 run_main_loop函数详解 cli_loop函数详解 cmd_process函数详解 run_main_loop函数详解 uboot启动以后会进入3秒倒计时,如果在3秒倒计时结束之前按下按下回车键,那么就,会进入uboot的命令模式,如果倒计时结束以后都没有按下回车键,那么就会自动启动Linux内核,这个功能…

MySQ ---- 函数

函数 函数是指一段可以直接被另一段程序调用的程序或代码。MySQL 内置了很多函数&#xff0c;开发人员只需要调用使用即可。查询语句中已经使用过了一些聚合函数。下面还有些常用的函数需要掌握。 函数应用场景举例 函数的分类 ① 字符串函数 ② 数值函数 ③ 日期函数 ④ 流程…

chap和ppp认证配置+MGRE实验

题目要求 1.R2为ISP&#xff0c;其上只能配置IP地址 2.R1-R2之间为HDLC封装 3.R2-R3之间为ppp封装&#xff0c;pap认证&#xff0c;R2为主认证方 4.R2-R4之间为ppp封装&#xff0c;chap认证&#xff0c;R2为主认证方 5.R1,R2,R3构建MGRE环境&#xff0c;仅R1的IP地址固定 6.内…

OpenPCDet系列 | 4.KITTI数据集数据加载流程代码解析

文章目录 数据加载流程0. create_kitti_infos1. __getitem__函数2. prepare_data函数3. collate_batch函数数据加载流程 这里记录一下具体用到的那些数据形式,整个kitti数据集的处理框架图如下所示: 在数据集处理到获取一个batch数据的整个流程的入口如下: # 开始迭代每…

STL常用容器

目录 一、string容器 1、基本概念 2、构造函数 3、赋值操作 4、字符串拼接 5、查找和替换 6、字符串比较 7、字符存取 8、插入与删除 9、获取字串 二、vector容器 1、基本概念 2、构造函数 3、赋值操作 4、容量和大小 5、插入和删除 6、数据存取 7、互换容器…

hadoop shell操作HDFS文件

一.常用的 hadoop shell 文件路径需要自己有才行&#xff0c;示例中的文件路径是本人自己的文件路径&#xff0c;不是公共文件路径&#xff0c;如何建立自己的数仓&#xff0c;查看本人 大数据单机学习环境搭建 相关文章 1.1查看 创建 删除 # 列出当前hdfs所存贮的文件 hado…

模式串匹配算法(朴素模式匹配与KMP)的机算与手算。

一.朴素模式匹配 1.机算 其实就是暴力匹配。 使用双指针 i (指向主串) j (指向模式串) 从主串 S 第一字符起,与模式串 T, 第一个字符比较&#xff0c;   ①若相同&#xff0c;则 i 与 j 统一向后移   ②若遇到 i 与 j 指向字符不同&#xff0c;回溯 i j 指针。继续如此&a…

经验分享|如何搭建产品帮助文档

作为一款优秀的产品&#xff0c;除了功能强大、易于使用等特点外&#xff0c;相应的使用说明和帮助文档也是至关重要的&#xff0c;这些说明和文档可以帮助用户更好地使用这款产品&#xff0c;并解决在使用过程中的问题。本篇文章将为大家详细介绍如何搭建一份优秀的产品帮助文…

12-Vue技术栈之Vuex的使用

目录 1、理解 vue1.1 vuex 是什么1.2 什么时候使用 Vue1.3 图解两种方式实现数据共享 2、搭建vuex环境2.1 下载vuex2.2 配置文件 3、基本使用3.1 求和案例纯vue写法3.2 求和案例vuex写法 4、getters的使用5、四个map方法的使用5.1 求和案例 6、 模块化命名空间6.1求和案例改造 …

C++“static“成员使用

1.static 成员概念 声明为static的类成员称为类的静态成员&#xff0c;用static修饰的成员变量&#xff0c;称之为静态成员变量&#xff1b;用static修饰的成员函数&#xff0c;称之为静态成员函数。静态成员变量一定要在类外进行初始化。 1.2 static特性 静态成员为所有类对…

JVM学习(十):方法区

目录 一、栈、堆和方法区的交互关系 二、对方法区的理解 2.1 方法区在哪里 2.2 方法区的基本概念 2.3 Hotspot中方法区的演进 三、方法区的大小 3.1 设置参数 3.1.1 jdk7及以前 3.1.2 jdk8以后&#xff1a; 3.2 配置参数演示OOM 四、方法区的内部结构 4.1 方法区里…

【Java虚拟机】JVM调优和分析案例综合实战

1.什么是JVM性能优化 jvm性能优化涉及到两个很重要的概念&#xff1a;吞吐量和响应时间。jvm调优主要是针对他们进行调整优化&#xff0c;达到一个理想的目标&#xff0c;根据业务确定目标是吞吐量优先还是响应时间优先。 吞吐量&#xff1a;用户代码执行时间/(用户代码执行时…

C语言学习分享(第六次)------数组

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C语言学习分享⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多C语言知识   &#x1f51d;&#x1f51d; 数组详解 1. 前言&#x1f536;2. …

使用 spring 的 IoC 的实现账户的CRUD(2)双层实现

spring实现service和dao的数据的查找 dao层设置接口实现dao层的接口service设置接口通过注入dao层&#xff0c;来实现接口 //dao层的接口&#xff0c;定义了根据id查询的方法 public interface Accountdao {Account findByid(int id); }实现接口&#xff1a;实现了查询的方法 …

【模板】拓扑排序

import java.util.Scanner; import java.util.*;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);int point in.nextInt();int side in.nextInt();int[][] arr new i…