SpringDI(依赖注入)的理解

news2024/11/25 10:30:23

目录

一、什么是SpringDI?

二、SpringDI(依赖注入)的作用是什么?

三、DI的实现方式

3.1 set注入

1.项目结构:

2.set注入对象

2.1applicationContext.xml:

 2.2 Student 实体类

 2.3 controller:

 2.4 dao: IUserDao:

2.5  service:IUserService:

2.6 Test01:

3. set注入基本类型与String

3.1  applicationContext.xml:

 4. set注入复杂类型

4.1  applicationContext.xml:

 4.2 Teacher实体类:

4.3 Text01:

3.2 构造注入

 1.applicationContext.xml:

2. Student:

3.3 注解注入

四、DI数据类型

五、DI使用步骤


一、什么是SpringDI?

DI(Dependecy Inject,中文释义:依赖注入)  是对IOC概念的不同角度的描述,是指应用程序在运行时,每一个bean对象都依赖IOC容器注入当前bean对象所需的另外一个bean对象。

(例如在 MyBatis 整合Spring 时,SqlSessionFactoryBean 依赖| IOC容器注入一个D
ataSource数据源bean ) 

二、SpringDI(依赖注入)的作用是什么?

作用:将springioc 容器所创建的各个组件,使用DI的语法进行关联,耦合(胶水)

三、DI的实现方式

1.set注入  2.构造注入  3.注解注入

3.1 set注入

语法:

        1.set方法
        2. set配置
                <property name value ref>

实现:

1.项目结构:

 

2.set注入对象
2.1applicationContext.xml:
    <!--name 属性代表的是Java类中的成员变量或属性名,它对应于类中的setter方法。-->
    <!--ref 属性用于指定要注入的依赖bean的名称。-->
    <!--通过 ref 属性,Spring可以将一个bean的实例注入到另一个bean的属性中,实现依赖注入。-->

<!--    注入数据访问-->
    <bean id="daoImp" class = "com.zad.dao.UserDaoImpl"></bean>
<!--    注入业务-->
    <bean id="serviceImp" class="com.zad.service.UserServiceImp">
        <!--将 serviceImp 这个bean注入到 controllerImp 中。-->
        <!--property相当于set方法-->
        <!--依赖注入-->
        <property name="dao" ref="daoImp"></property>
    </bean>

<!--   注入控制器-->
    <bean id="controllerImp" class="com.zad.controller.UserControllerImpl">
        <property name="service" ref="serviceImp"></property>
    </bean>
 2.2 Student 实体类
public class Student {
    private  String stuName;
    private int stuAge;
    private String stuHobby;


    /*****************set注入********************/
    public void setStuName(String stuName) {
        this.stuName = stuName;
    }

    public void setStuAge(int stuAge) {
        this.stuAge = stuAge;
    }

    public void setStuHobby(String stuHobby) {
        this.stuHobby = stuHobby;
    }
    /*****************set注入********************/
    @Override
    public String toString() {
        return "Student{" +
                "stuName='" + stuName + '\'' +
                ", stuAge=" + stuAge +
                ", stuHobby='" + stuHobby + '\'' +
                '}';
    }
}
 2.3 controller:

 IUserController:

public interface IUserController {
    public void save();
}

  UserControllerImpl:

public class UserControllerImpl implements IUserController {
    IUserService service ;

    public void setService(IUserService service){
        this.service = service;
    }

    @Override
    public void save() {
        System.out.println("===controller的新增方法===");
        service.save();

    }
}
 2.4 dao: IUserDao:
public interface IUserDao {
    public void save();
}

  UserDaoImpl:

public class UserDaoImpl implements IUserDao{

    @Override
    public void save() {
        System.out.println("===dao的新增方法===");
    }
}
2.5  service:IUserService:
public interface IUserService {
    public void save();
}

 UserServiceImp:

public class UserServiceImp implements IUserService{

    IUserDao dao ;

    public void setDao(IUserDao dao){
        this.dao = dao;
    }

    @Override
    public void save() {
        System.out.println("===service的新增方法===");
        dao.save();
    }
}
2.6 Test01:
public class Text01 {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        IUserController controller = (IUserController)applicationContext.getBean("controllerImp");
        Student student = (Student) applicationContext.getBean("student");
        controller.save();
        System.out.println(student);
      controller.save();

    }
}

结果:

===controller的新增方法===
===service的新增方法===
===dao的新增方法===
Student{stuName='zwy', stuAge=18, stuHobby='学习'}
3. set注入基本类型与String
3.1  applicationContext.xml:
    <bean id="student" class="com.zad.pojo.Student">
        <property name="stuName" value="zwy"/>
        <property name="stuAge" value="18"/>
        <property name="stuHobby" value="学习"/>
    </bean>

其他层同上:

结果:

===controller的新增方法===
===service的新增方法===
===dao的新增方法===
Student{stuName='zwy', stuAge=18, stuHobby='学习'}
 4. set注入复杂类型
4.1  applicationContext.xml:
<bean id="teacher" class="com.zad.pojo.Teacher">
        <property name="myList">
            <list>
                <value>老米家泡馍</value>
                <value>红红炒米</value>
                <value>马昆砂锅</value>
                <value>石家包子</value>
            </list>
        </property>
        <property name="array">
            <array>
                <value>游戏</value>
                <value>跑步</value>
                <value>谈恋爱</value>
                <value>学习S</value>
            </array>
        </property>
        <property name="mySet">
            <set>
                <value>茶话弄</value>
                <value>茶百道</value>
                <value>蜜雪冰城</value>
                <value>霸王茶姬</value>
                <value>茉莉奶绿</value>
            </set>
        </property>
        <property name="myMap">
            <map>
                <entry key="杨文琪" value="心动"/>
                <entry key="贺佳瑶" value="小贺"/>
                <entry key="张甜甜" value="小猪佩奇"/>
                <entry key="林航宇" value="林"/>
            </map>
        </property>
        <property name="myProp">
            <props>
                <prop key="法国">巴黎</prop>
                <prop key="英国">伦敦</prop>
                <prop key="日本">东京</prop>
                <prop key="美国">华盛顿</prop>
                <prop key="俄罗斯">乌克兰</prop>
            </props>
        </property>
    </bean>
 4.2 Teacher实体类:
public class Teacher {
    private List myList;
    private Set mySet;
    private String[] array;
    private Map myMap;
    private Properties myProp;

    public void setMyList(List myList) {
        this.myList = myList;
    }

    public void setMySet(Set mySet) {
        this.mySet = mySet;
    }

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

    public void setMyMap(Map myMap) {
        this.myMap = myMap;
    }

    public void setMyProp(Properties myProp) {
        this.myProp = myProp;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "myList=" + myList +
                ", mySet=" + mySet +
                ", array=" + Arrays.toString(array) +
                ", myMap=" + myMap +
                ", myProp=" + myProp +
                '}';
    }
}
4.3 Text01:
public class Text01 {
    public static void main(String[] args) {

        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        IUserController controller = (IUserController)applicationContext.getBean("controllerImp");

        Teacher teacher = (Teacher) applicationContext.getBean("teacher");
        controller.save();
        System.out.println(teacher);


    }
}

结果:

===controller的新增方法===
===service的新增方法===
===dao的新增方法===
Teacher{myList=[老米家泡馍, 红红炒米, 马昆砂锅, 石家包子], mySet=[茶话弄, 茶百道, 蜜雪冰城, 霸王茶姬, 茉莉奶绿], array=[游戏, 跑步, 谈恋爱, 学习S], myMap={杨文琪=心动, 贺佳瑶=小贺, 张甜甜=小猪佩奇, 林航宇=林}, myProp={法国=巴黎, 俄罗斯=乌克兰, 英国=伦敦, 日本=东京, 美国=华盛顿}}
3.2 构造注入

1.构造方法
2.构造配置
        <constructor-arg name type index value ref>

 1.applicationContext.xml:
    <bean id="student2" class="com.zad.pojo.Student">
        <constructor-arg name="stuName" value="xn"/>
        <constructor-arg name="stuAge" value="18"/>
        <constructor-arg name="stuHobby" value="睡觉"/>
    </bean>
    <bean id="student3" class="com.zad.pojo.Student">
        <constructor-arg  type="java.lang.String" value="xn"/>
        <constructor-arg  type="int" value="18"/>
        <constructor-arg  type="java.lang.String" value="睡觉"/>
    </bean>
    <bean id="student4" class="com.zad.pojo.Student">
        <constructor-arg index="0" value="xn"/>
        <constructor-arg index="1" value="18"/>
        <constructor-arg index="2" value="睡觉"/>
    </bean>

<!--   注入控制器-->
    <bean id="controllerImp2" class="com.zad.controller.UserControllerImpl">
        <property name="service" ref="serviceImp2"></property>
    </bean>
    <!--    注入业务-->
    <bean id="serviceImp2" class="com.zad.service.UserServiceImp">
        <property name="dao" ref="daoImp2"></property>
    </bean>
    <!--    注入数据访问-->
    <bean id="daoImp2" class = "com.zad.dao.UserDaoImpl"></bean>
2. Student:
public class Student {
    private  String stuName;
    private int stuAge;
    private String stuHobby;
    /*****************构造注入********************/
    public Student(String stuName, int stuAge, String stuHobby) {
        this.stuName = stuName;
        this.stuAge = stuAge;
        this.stuHobby = stuHobby;
    }

    public Student() {
    }
}

3. Text01:

public class Text01 {
    public static void main(String[] args) {

        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

        Student student2 = (Student) applicationContext.getBean("student2");
        Student student3 = (Student) applicationContext.getBean("student3");
        Student student4 = (Student) applicationContext.getBean("student4");
        System.out.println(student2);
        System.out.println(student3);
        System.out.println(student4);

        IUserController controller = (IUserController) applicationContext.getBean("controllerImp2");
        controller.save();

    }
}

结果:

Student{stuName='xn', stuAge=18, stuHobby='睡觉'}
Student{stuName='xn', stuAge=18, stuHobby='睡觉'}
Student{stuName='xn', stuAge=18, stuHobby='睡觉'}
===controller的新增方法===
===service的新增方法===
===dao的新增方法===
3.3 注解注入

四、DI数据类型

1.基本类型与String
2.JavaBean
3.复杂类型,list、 set、 array、 map、 properties ( 构造注入不支持)

五、DI使用步骤

1.思考,什么方式,什么数据类型
2.给属性提供set(构造)方法
3.编写配置文件

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

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

相关文章

SpringIOC容器对Bean管理

一、bean实例化 1.通过构造方法&#xff08;默认&#xff09; 2.通过工厂方法 3.通过静态工厂方法 项目结构&#xff1a; 1. 通过构造方法&#xff08;默认&#xff09; 1.1 pojo实体类&#xff1a; Student: public class Student {public Student() {System.out.println…

软件安全测试报告内容和作用简析,软件测试服务供应商推荐

在数字化时代&#xff0c;软件安全问题愈发凸显&#xff0c;安全测试显得尤为重要。软件安全测试报告是对软件系统在安全性方面进行评估和分析后的书面文件。该报告通常包含测试过程、测试发现、漏洞描述、风险评估及改进建议等重要信息。报告的目的是为了帮助开发团队及时发现…

各种排序算法【持续更新中.....】

1.归并排序 归并排序 &#xff0c;归并排序是采用分治法(Divide and Conquer&#xff09;的一个非常典型的应用&#xff0c;所以我们先来说一下什么是分治法。 分治法 定义 分治&#xff08;英语&#xff1a;Divide and Conquer&#xff09;&#xff0c;字面上的解释是「分…

C++初阶大全

目录 一.命名空间 1.命名空间定义 2.命名空间使用 二.C输入&输出 三.缺省参数 四. 函数重载 五.引用 1.常引用 2.传值、传引用效率比较 3.引用和指针的区别 4.引用和指针的不同点: 小知识点: 六.内联函数 七.auto关键字(C11) 1.auto的使用细则 八.基于范围…

为何你的进销存系统买来却成了摆设?教你7大招解决!

我做企业数字化系统9年&#xff0c;调研的企业大大小小也有几十家了。我发现个挺扎心的现象&#xff1a;有三成企业买的进销存系统&#xff0c;最后都成了闲置的“高科技装饰品”。为啥这些企业舍得掏腰包&#xff0c;到头来却让它们吃灰呢&#xff1f; 说到底&#xff0c;就一…

开源免费的wiki知识库

开源的Wiki知识库有多种选择&#xff0c;它们各自具有不同的特点和优势&#xff0c;适用于不同的场景和需求。以下是一些主流的开源Wiki知识库系统&#xff1a; MediaWiki 简介&#xff1a;MediaWiki是使用PHP编写的免费开源Wiki软件包&#xff0c;是Wikipedia和其他Wikimedia…

达梦数据库的系统视图v$mem_reginfo

达梦数据库的系统视图v$mem_reginfo 达梦数据库的V$MEM_REGINFO视图提供了系统当前已分配但未释放的内存信息。这个视图在MEMORY_LEAK_CHECK参数设置为1时才会注册信息&#xff0c;用于监控内存的申请和释放情况。通过查询V$MEM_REGINFO视图&#xff0c;可以关注REFNUM字段&am…

跟《经济学人》学英文:2024年08月03日这期 Britain’s railways go from one extreme to another

Britain’s railways go from one extreme to another Departing: privatisation. Destination: centralisation 出发:私有化。目的地:集中化 depart&#xff1a;出发 privatisation&#xff1a;美 [ˌpraɪvətaɪ’zeɪʃən] 私有化&#xff1b;民营化&#xff1b;私营化…

IO进程—进程间的通信—共享内存具体函数操作

创建唯一key值—— ftok key_t ftok(const char *pathname, int proj_id); #include <sys/types.h> #include <sys/ipc.h> 功能&#xff1a; ftok函数是用于生成一个键值&#xff08;key_t类型&#xff09;的函数&#xff0c;这个键值通常用于进程间通信&#xff0…

人像修复-通道磨皮

文章目录 原理步骤建立动作一键操作 原理 皮肤看起来比较脏的原因&#xff1a;光影过渡不均匀 步骤 在通道中&#xff0c;找到明暗反差最大的通道&#xff0c;复制一层通道 在复制通道中&#xff0c;用高反差保留&#xff0c;把画面中反差较大的部分保留出来&#xff0c;半…

解决使用Navicat连接数据库时,打开数据库表很慢的问题

今天使用Navicat连接数据库时&#xff0c;发现不管表中数据多少&#xff0c;打开数据库表非常慢。 解决方法&#xff1a; Navicat - 右键编辑数据库连接 - 高级 - 勾选保持连接间隔 - 输入框设置为20 - 点击确定&#xff01; 参考文章&#xff1a;https://51.ruyo.net/14030.…

【ARM】v8架构programmer guide(2)_处理器及V8基础

目录 2.1 ARMv8-A 3. ARMv8的基础 普通世界&#xff08;Non-secure state&#xff09;的特权组件&#xff1a; 安全世界&#xff08;Secure state&#xff09;的特权组件&#xff1a; 安全监视器&#xff08;Secure Monitor&#xff09;&#xff1a; 3.1 execution state…

实现高级社会的构想-基于人工智能模式

实现高级社会(共产主义)的构想 刚过完劳动节,劳动最光荣.在新质生产力思想启发下,我想探讨的是我们当下能否从资本主义或社会主义进入或构建高级社会(共产主义社会)呢?高级社会(共产主义),我的理解可以用平均主义来无限接近,即使政策上无法做到平均分配&#xff0c;也可以通过…

lvs的nat模式配置

lvs的nat模式 准备工作 lvs主机需要两个网络适配器&#xff0c;其中一个为NAT模式&#xff0c;另外一个为仅主机模式&#xff0c;还需要两个server主机&#xff0c;一个为server1还有一个为server2&#xff0c;都为仅主机模式 配置过程 配置ip lvs主机 [rootlvs ~]# cat /…

项目中引入RedisTemplate和Redisson时RedisTemplate无法使用zset问题(栈溢出stackOverflow)深入源码分析解决

文章目录 项目中引入RedisTemplate和Redisson时RedisTemplate无法使用zset问题&#xff08;栈溢出stackOverflow&#xff09;深入源码分析解决依赖信息报错信息与分析解决办法 项目中引入RedisTemplate和Redisson时RedisTemplate无法使用zset问题&#xff08;栈溢出stackOverfl…

utf-8‘ codec can‘t decode byte 0xd3 in position

1.背景 安装psycopg2-binary&#xff0c;安装命令“pip install psycopg2-binary2.9.7” 完整报错信息如下&#xff1a; (venv) PS D:\workspace_all\pyCharm\MaxKB-main> pip install psycopg2-binary2.9.7 Looking in indexes: https://mirrors.ustc.edu.cn/pypi/web/s…

Python语法重温1

最近做项目的时候&#xff0c;有时总得愣一下语法。所以决定来温习一下。。。 温故而知新&#xff0c;谁都没办法说自己经历时间的流逝后还能时刻记得&#xff0c;希望能帮到你们 列表的替换 如果超出列表元素则会报错。 列表末尾的追加 插入列表操作 可以超出列表之外插入 删…

常见中间件漏洞复现之【WebLogic】!

Weblogic介绍 WebLogic是美国Oracle公司出品的⼀个application server&#xff0c;确切的说是⼀个基于JAVAEE架构的中间件&#xff0c;默认端⼝&#xff1a;7001 WebLogic是⽤于开发、集成、部署和管理⼤型分布式Web应⽤、⽹络应⽤和数据库应⽤的Java应⽤服务器。将Java的动态…

“炎”值加码,数据机房“中暑“罢工,怎么破?

又是热到汗流浃背、头晕脑胀的一天…江浙沪等地正在经历今年来最强高温“烤验”&#xff01;没有最热&#xff0c;只有更热&#xff0c;40摄氏度的高温好像越来越多了&#xff01;最近东北货车司机热到报警&#xff0c;获救后怒赞“杭州人好啊&#xff01;”&#xff0c;“先坐…

DataX迁移数据到StarRocks超大表报too many version问题记录

目录 1 背景说明 2 问题描述 3 解决思路 3.1 磁盘问题 3.2 DataX配置 3.3 分桶设置 3.4 增量迁移 1 背景说明 项目上有两张大表&#xff0c;数据量在300w左右&#xff0c;每天凌晨通过datax将前一天最新的全量户数迁移到StarRocks对应的分区表中。分区表设置的动态分区&a…