Spring中的依赖注入DI
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的更多相关文章
- spring中的依赖注入(DI)笔记
使用xml bean依赖注入有set注入和构造器注入 set注入用的比较多 <bean id="a" class="com.A"> <prop ...
- Atitit js中的依赖注入di ioc的实现
Atitit js中的依赖注入di ioc的实现 全类名(FQCN)为标识符1 混合请求模式1 使用类内 builder 即可..2 Service locator method走ok拦2 Jav ...
- Spring学习(三)——Spring中的依赖注入的方式
[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...
- JavaEE开发之Spring中的依赖注入与AOP
上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...
- JavaEE开发之Spring中的依赖注入与AOP编程
上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...
- 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, ...
- Spring学习(一)——Spring中的依赖注入简介【转】
[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring. ...
- Spring学习(一)——Spring中的依赖注入简介
[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...
- Spring(2):依赖注入DI
依赖注入DI 当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在 传统的程序设计过程中,通常由调用者来创建被调用者的实例.但在Spring里,创建被 ...
- ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下
先简单了解一这个几个 名词的意思. 控制反转(IOC) 依赖注入(DI) 并不是某种技术. 而是一种思想.一种面向对象编程法则 什么是控制反转(IOC)? 什么是依赖注入(DI) 可以点击下面链接 ...
随机推荐
- FLink16--计数窗口--CountWindiwApp
一.依赖 https://www.cnblogs.com/robots2/p/16048648.html 二.代码 概念:窗口来多少条计算一次,存在滚动和滑动两种情况 package net.xdcl ...
- Log4j2 Garbage-free 无垃圾回收模式实践与总结
Log4j2 内置 Garbage-free(无垃圾)模式,可重用对象和缓冲区,减少日志记录时产生的垃圾对象,避免 JVM 进行 GC 回收,进而提升应用程序的性能与响应速度.以下以 Log4j2 的 ...
- 在table中tr的display:block显示布局错乱问题
参考链接:https://blog.csdn.net/zj853975468/article/details/51554054?utm_medium=distribute.pc_relevant_do ...
- 大型语言模型(LLM)为什么处理日语这么“头大”?
引言 你有没有想过,为什么 AI 大神们处理日语时,总是会挠头?其实,这都要从"token"这个神奇的小东西说起. 在大型语言模型(LLM)中,token 就是文本的基本处理单位. ...
- kafka 认识kafka(一)
一.简介 1.1 概述 Kafka是最初由Linkedin公司开发,是一个分布式.分区的.多副本的.多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/ ...
- DeepSeek满血版测试
技术背景 很多厂商以次充好,用蒸馏版DeepSeek冒充满血版.本文提供一些收集的问题集,可以用于测试是否满血DeepSeek.经过实际测试,国内厂商中只有满血版DeepSeek可以全对.但是各厂商后 ...
- CF2018C Tree Pruning
分析 好像官方题解是反向求解的,这里提供一个正向求解的思路,即直接求出最后所有叶节点到根的距离相同为 \(x\) 时需要删除的结点数 \(ans_x\) . 如果我们最后到根的相同距离为 \(x\), ...
- 【Ryan】: linux下挂在共享文件夹
点击查看代码 $ vmware-hgfsclient $ sudo vmhgfs-fuse .host:/ /mnt -o allow_other
- dig命令命令常见用法
域名结构 主机名.次级域名.域名.根域名 host. sld .tld .root 几种常见的解析类型 A记录 CNAME txt记录 dig命令命令常见用法 dig,"domain inf ...
- Qt 设置QTableView表格列宽自动均分表格
文章目录 Qt 设置QTableView表格列宽自动均分表格 前言 setSectionResizeMode 通过获取字体占的像素来设置 Qt 设置QTableView表格列宽自动均分表格 前言 最近 ...