Spring中的依赖注入DI

依赖注入的简单理解就是给对象设置变量值。

Spring配置文件

<?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"> <!--Spring中的依赖注入DI
依赖注入:
Dependency Injection
IOC的作用:
降低程序间的耦合(依赖关系)
依赖关系的管理:
以后都交给spring来维护
在当前类需要用到其他类的对象,由spring为我们提供,我们只需要在配置文件中说明
依赖注入的维护:
就称为依赖注入。
依赖注入:
能注入的数据:有三类
基本类型和String
其他bean类型(在配置文件中或者注解配置过的bean)
复杂类型/集合类型
注入的方式:有三种
第一种:使用构造函数提供
第二种:使用set方法提供
第三种:使用注解提供(明天的内容) --> <!--方式一 构造函数注入:
使用的标签:constructor-arg
标签出现的位置:bean标签的内部
标签中的属性:
type:用于指定要注入的数据类型,该数据类型也是构造函数中某个或某些参数的类型
index:用于指定要注入的数据给构造函数中指定索引位置的参数赋值。索引的位置是从0开始
name:用于指定给构造函数中指定名称中的参数赋值 ***常用***
=============以上三个用于指定给构造函数中哪个参数赋值==================
value:用于提供基本类型和String类型的数据
ref:用于指定其他的bean类型数据。它指的几句诗在spring的Ioc核心容器中出现过的bean对象 优势:在获取bean对象时,注入数据是必须的操作,否则对象无法创建成功
弊端:改变了bean对象的实例化方式,使我们在创建对象时,如果用不到这些数据,也必须提供。
-->
<bean id="accountService1" class="com.zjw.service.impl.AccountServiceImpl">
<!--<constructor-arg name="name" value="zjw"/>-->
<constructor-arg index="0" value="aaa"/>
<constructor-arg name="age" value="25"/>
<constructor-arg name="birthday" ref="now"/>
</bean> <!--配置一个时间对象-->
<bean id="now" class="java.util.Date"/> <!--方式二 set方法注入 更常用的方式
涉及的标签:property
出现的位置:bean标签的内部
标签的属性
name:用于指定给set方法名称
value:用于提供基本类型和String类型的数据
ref:用于指定其他的bean类型数据。它指的几句诗在spring的Ioc核心容器中出现过的bean对象
优势:
创建对象时没有明确的限制,可以直接使用默认构造函数
弊端:
如果有某些成员必须有值,则获取对象是有可能set方法没有执行
-->
<bean id="accountService2" class="com.zjw.service.impl.AccountService2Impl">
<property name="age" value="18"/>
<property name="name" value="zjw"/>
<property name="birthday" ref="now"/>
</bean> <!--复杂类型的注入/集合类型的注入
用于给List结构集合注入的标签
array,list,set
用于给Map结构集合注入的标签
map props
结构相同,标签可以互换
-->
<bean id="accountService3" class="com.zjw.service.impl.AccountService3Impl">
<!--给数组[]赋值-->
<property name="myStrs">
<set>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</set>
</property>
<!--List集合赋值-->
<property name="myList">
<set>
<value>list1</value>
<value>bbb</value>
<value>ccc</value>
</set>
</property>
<!--Set集合赋值-->
<property name="mySet">
<set>
<value>set1</value>
<value>bbb</value>
<value>ccc</value>
</set>
</property>
<!--Map集合赋值-->
<property name="myMap">
<map>
<entry key="testA" value="aaa"/>
<entry key="testB" value="BBB"/>
</map>
</property>
<!--Properties集合赋值-->
<property name="myProps">
<props>
<prop key="testC">CC</prop>
<prop key="testD">DD</prop>
</props>
</property> </bean> </beans>

AccountServiceImpl

package com.zjw.service.impl;

import com.zjw.service.IAccountService;
import lombok.ToString; import java.util.Date; /**
* 账户的业务层实现类
* @author zjw
*/
@ToString
public class AccountServiceImpl implements IAccountService { private String name;
private Integer age;
private Date birthday; public AccountServiceImpl(String name, Integer age, Date birthday) {
this.name = name;
this.age = age;
this.birthday = birthday;
} public AccountServiceImpl(String name, Integer age) {
this.name = name;
this.age = age;
} @Override
public void saveAccount() {
System.out.println("AccountServiceImpl……中的saveAccount方法执行了\n"+this.toString()+"\n");
} }

AccountService2Impl

/**
* 账户的业务层实现类
* @author zjw
*/
@Setter
@ToString
public class AccountService2Impl implements IAccountService { private String name;
private Integer age;
private Date birthday; @Override
public void saveAccount() {
System.out.println("AccountService2Impl……中的saveAccount方法执行了\n"+ this + "\n");
} }

AccountService3Impl

/**
* 账户的业务层实现类
* @author zjw
*/
@Setter
public class AccountService3Impl implements IAccountService { private String[] myStrs;
private List<String> myList;
private Set<String> mySet;
private Map<String,String> myMap;
private Properties myProps; @Override
public void saveAccount() {
System.out.println("accountService中的saveAccount方法执行了");
System.out.println("数组myStrs: " + Arrays.toString(myStrs));
System.out.println("List集合myList:" + myList);
System.out.println("Set集合:" + mySet);
System.out.println("Map集合:" + myMap);
System.out.println("Properties:" + myProps);
}
}

测试

/**
* 模拟一个表现层,用于调用业务层
*/
public class Client { public static void main(String[] args) { //1.获取核心容器对象
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml"); System.out.println("*****accountService1……通过构造方法依赖注入*****");
IAccountService accountService1 = (IAccountService) ac.getBean("accountService1");
accountService1.saveAccount(); System.out.println("*****accountService2……通过setter方法依赖注入*****");
IAccountService accountService2 = (IAccountService) ac.getBean("accountService2");
accountService2.saveAccount(); System.out.println("*****accountService3……复杂类型的注入/集合类型的注入*****");
IAccountService accountService3 = (IAccountService) ac.getBean("accountService3");
accountService3.saveAccount();
}
}

结果

*****accountService1……通过构造方法依赖注入*****
AccountServiceImpl……中的saveAccount方法执行了
AccountServiceImpl(name=aaa, age=25, birthday=Wed Dec 20 20:54:53 CST 2023) *****accountService2……通过setter方法依赖注入*****
AccountService2Impl……中的saveAccount方法执行了
AccountService2Impl(name=zjw, age=18, birthday=Wed Dec 20 20:54:53 CST 2023) *****accountService3……复杂类型的注入/集合类型的注入*****
accountService中的saveAccount方法执行了
数组myStrs: [aaa, bbb, ccc]
List集合myList:[list1, bbb, ccc]
Set集合:[set1, bbb, ccc]
Map集合:{testA=aaa, testB=BBB}
Properties:{testD=DD, testC=CC}

Spring中的依赖注入DI的更多相关文章

  1. spring中的依赖注入(DI)笔记

    使用xml bean依赖注入有set注入和构造器注入 set注入用的比较多 <bean id="a" class="com.A"> <prop ...

  2. Atitit js中的依赖注入di ioc的实现

    Atitit js中的依赖注入di ioc的实现 全类名(FQCN)为标识符1 混合请求模式1 使用类内  builder  即可..2 Service locator method走ok拦2 Jav ...

  3. Spring学习(三)——Spring中的依赖注入的方式

    [前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...

  4. JavaEE开发之Spring中的依赖注入与AOP

    上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...

  5. JavaEE开发之Spring中的依赖注入与AOP编程

    上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...

  6. ADO.NET .net core2.0添加json文件并转化成类注入控制器使用 简单了解 iTextSharp实现HTML to PDF ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下 C# AutoMapper 了解一下

    ADO.NET   一.ADO.NET概要 ADO.NET是.NET框架中的重要组件,主要用于完成C#应用程序访问数据库 二.ADO.NET的组成 ①System.Data  → DataTable, ...

  7. Spring学习(一)——Spring中的依赖注入简介【转】

      [前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring. ...

  8. Spring学习(一)——Spring中的依赖注入简介

    [前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...

  9. Spring(2):依赖注入DI

    依赖注入DI 当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在 传统的程序设计过程中,通常由调用者来创建被调用者的实例.但在Spring里,创建被 ...

  10. ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下

    先简单了解一这个几个 名词的意思. 控制反转(IOC) 依赖注入(DI) 并不是某种技术. 而是一种思想.一种面向对象编程法则 什么是控制反转(IOC)?  什么是依赖注入(DI) 可以点击下面链接 ...

随机推荐

  1. FLink16--计数窗口--CountWindiwApp

    一.依赖 https://www.cnblogs.com/robots2/p/16048648.html 二.代码 概念:窗口来多少条计算一次,存在滚动和滑动两种情况 package net.xdcl ...

  2. Log4j2 Garbage-free 无垃圾回收模式实践与总结

    Log4j2 内置 Garbage-free(无垃圾)模式,可重用对象和缓冲区,减少日志记录时产生的垃圾对象,避免 JVM 进行 GC 回收,进而提升应用程序的性能与响应速度.以下以 Log4j2 的 ...

  3. 在table中tr的display:block显示布局错乱问题

    参考链接:https://blog.csdn.net/zj853975468/article/details/51554054?utm_medium=distribute.pc_relevant_do ...

  4. 大型语言模型(LLM)为什么处理日语这么“头大”?

    引言 你有没有想过,为什么 AI 大神们处理日语时,总是会挠头?其实,这都要从"token"这个神奇的小东西说起. 在大型语言模型(LLM)中,token 就是文本的基本处理单位. ...

  5. kafka 认识kafka(一)

      一.简介 1.1 概述 Kafka是最初由Linkedin公司开发,是一个分布式.分区的.多副本的.多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/ ...

  6. DeepSeek满血版测试

    技术背景 很多厂商以次充好,用蒸馏版DeepSeek冒充满血版.本文提供一些收集的问题集,可以用于测试是否满血DeepSeek.经过实际测试,国内厂商中只有满血版DeepSeek可以全对.但是各厂商后 ...

  7. CF2018C Tree Pruning

    分析 好像官方题解是反向求解的,这里提供一个正向求解的思路,即直接求出最后所有叶节点到根的距离相同为 \(x\) 时需要删除的结点数 \(ans_x\) . 如果我们最后到根的相同距离为 \(x\), ...

  8. 【Ryan】: linux下挂在共享文件夹

    点击查看代码 $ vmware-hgfsclient $ sudo vmhgfs-fuse .host:/ /mnt -o allow_other

  9. dig命令命令常见用法

    域名结构 主机名.次级域名.域名.根域名 host. sld .tld .root 几种常见的解析类型 A记录 CNAME txt记录 dig命令命令常见用法 dig,"domain inf ...

  10. Qt 设置QTableView表格列宽自动均分表格

    文章目录 Qt 设置QTableView表格列宽自动均分表格 前言 setSectionResizeMode 通过获取字体占的像素来设置 Qt 设置QTableView表格列宽自动均分表格 前言 最近 ...