Spring依赖注入和控制反转

文章目录

  • 1、依赖注入
    • 1.1、依赖注入和控制反转的概念
    • 1.2、依赖注入的实现方式
    • 1.3、控制反转的具体实现
    • 1.4、依赖注入的具体实现
    • 1.5、依赖注入和控制反转总结

1、依赖注入

1.1、依赖注入和控制反转的概念

依赖注入(Dependency Injection, 简称DI)与控制反转(IoC)的含义相同,只不过这两个称呼是从两个角度描述的同一个概念。

当某个Java对象(调用者)需要调用另一个Java对象(被调用者,即被依赖对象)时,在传统模式下,调用者通常会采用“new被调用者”的代码方式来创建对象,如图所示。这种方式会导致调用者与被调用者之间的耦合性增加,不利于后期项目的升级和维护。
在这里插入图片描述

在使用Spring框架之后,对象的实例不再由调用者来创建,而是由Spring 容器来创建,Spring容器会负责控制程序之间的关系,而不是由调用者的程序代码直接控制。这样,控制权由应用代码转移到了Spring 容器,控制权发生了反转,这就是Spring的控制反转。

从Spring容器的角度来看,Spring 容器负责将被依赖对象赋值给调用者的成员变量,这相
当于为调用者注入了它依赖的实例,这就是Spring的依赖注入。

在这里插入图片描述

1.2、依赖注入的实现方式

  1. 属性setter方法注入;
  2. 构造方法注入;
  • 属性setter方法注入:指Spring容器使用setter 方法注入被依赖的实例。通过调用无参
    构造器或无参静态工厂方法实例化Bean后,调用该Bean的setter 方法,即可实现基于setter
    方法的依赖注入。
  • 构造方法注入:指Spring容器使用构造方法注入被依赖的实例。基于构造方法的依赖注
    入通过调用带参数的构造方法来实现,每个参数代表着一个依赖。

1.3、控制反转的具体实现

1.接口

package com.nynu.qdy.ioc;
public interface UserDao{public  void say() ;
}

2.接口实现类

package com.nynu.qdy.impl;import com.nynu.qdy.ioc.UserDao;public class UserDaolmpl implements UserDao{public void say() {System.out.println("userDao say hello World!");}
}

3.Spring的配置文件applicationContext.xml

<?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-4.3.xsd"><!-- 将指定类配置给Spring,让Spring创建其对象的实例 --><!-- 这是SpringIOC容器的控制反转机制 --><bean id="userDao" class="com.nynu.qdy.impl.UserDaolmpl">
</beans>

4.测试类

package com.nynu.qdy.ioc;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestloC {@SuppressWarnings("resource")public static void main(String[] args) {// 1.初始化spring容器,加载配置文件ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");// 2.通过容器获取userDao容器UserDao userDao = (UserDao) applicationContext.getBean("userDao");// 3.调用实例中的方法userDao.say();}
}

5.结果

userDao say hello World!

1.4、依赖注入的具体实现

1.接口

package com.nynu.qdy.ioc;public interface UserService {public void say();
}

2.实现类

package com.nynu.qdy.impl;import com.nynu.qdy.ioc.UserDao;
import com.nynu.qdy.ioc.UserService;public class UserServiceImpl implements UserService {// 生命UserDao属性private UserDao userDao;public void setUserDao(UserDao userDao) {this.userDao = userDao;}// 实现接口中的方法public void say() {// 调用userDao中的say()方法,并执行输出语句this.userDao.say();System.out.println("userService say hello WOrld!");}}

3.配置文件applicationContext.xml

<!--添加一个id为userService的实例 --><!-- 将id为userDao的Bean实例注入到userService实例中 --></bean><bean id="userService" class="com.nynu.qdy.impl.UserServiceImpl"><!-- 完成属性赋值 --><property name="userDao" ref="userDao" /></bean>

4.测试类

package com.nynu.qdy.ioc;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestDI {@SuppressWarnings("resource")public static void main(String[] args) {// 1.初始化spring容器,加载配置文件ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");// 2.通过容器获取UserService实例UserService userService = (UserService) applicationContext.getBean("userService");// 3.调用实例中的say()方法userService.say();}
}

5.结果

userDao say hello World!
userService say hello WOrld!

1.5、依赖注入和控制反转总结

这里是对ioc和di的总结和理解!

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

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

相关文章

Hadoop入门(五)IO操作

一、HadoopIO操作意义 Hadoop自带一套用于I/O的原子性的操作 &#xff08;不会被线程调度机制打断&#xff0c;一直到结束&#xff0c;中间不会有任何context switch&#xff09; 特点 基于保障海量数据集的完整性和压缩性 Hadoop提供了一些用于开发分布式系统的API&#xff…

使用Identity Server 4建立Authorization Server (1)

预备知识: 学习Identity Server 4的预备知识 本文内容基本完全来自于Identity Server 4官方文档: https://identityserver4.readthedocs.io/ 官方文档很详细的. 使用OAuth可以更安全, 这里我们的authorization server和web api 以及网站将分别独立运行. 建立authorization ser…

欢乐纪中某B组赛【2019.1.18】

前言 新年新气象&#xff0c;我们又一度迎来新一年的模拟赛(谁想迎来) 总之&#xff0c;有来到了熟悉的地方——纪中。 成绩 RankRankRank是有算别人的 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCCDDD2222017myself2017myself2017myself300300300100100100100100…

Python和SQL Server 2017的力量

Python是SQL Server 2017的新功能。 它主要是为了允许在SQL Server中使用基于Python的机器学习&#xff0c;但是它可以与任何Python库或框架一起使用。为了提供可能的例子&#xff0c;Hitendra展示了如何安全地使用该功能来提供智能应用程序缓存&#xff0c;其中SQL Server可以…

Spring中的Bean配置、属性配置、装配内容详细叙述

文章目录1、Bean的配置1.1、配置方式2、Bean的实例化2.1、构造器实例化2.2、静态工厂方式实例化2.3、实例工厂方式实例化3、Bean的作用域3.1、作用域的种类4、Bean的生命周期5、Bean的装配方式5.1、基于XML的装配5.2、基于Annotation的装配5.3、自动装配1、Bean的配置 1.1、配…

Hadoop入门(六)Mapreduce

一、Mapreduce概述 MapReduce是一个编程模型&#xff0c;用以进行大数据量的计算 二、Hadoop MapReduce &#xff08;1&#xff09;MapReduce是什么 Hadoop MapReduce是一个软件框架&#xff0c;基于该框架能够容易地编写应用程序&#xff0c;这些应用程序能够运行在由上千个…

github详细搜索

in:name vue in:description 爬虫 stars:>1000 language:JavaScript

jzoj2941-贿赂【数学期望,dfs】

正题 题目大意 nnn个人&#xff0c;有投票几率aia_iai​和级别bib_ibi​&#xff0c;kkk个糖&#xff0c;每个可以让一个官员增加0.10.10.1的投票几率。 然后如果有超过一半的人投你&#xff0c;你就可以成功。 不然成功概率就是A/(A∑i∈Sbi)A/(A\sum^{i\in S}b_i)A/(A∑i∈S​…

Ocelot API网关的实现剖析

在微软Tech Summit 2017 大会上和大家分享了一门课程《.NET Core 在腾讯财付通的企业级应用开发实践》&#xff0c;其中重点是基于ASP.NET Core打造可扩展的高性能企业级API网关&#xff0c;以开源的API网关Ocelot为基础结合自己的业务特性&#xff0c;当天课程只有40分钟&…

Hadoop入门(十二)Intellij IDEA远程向hadoop集群提交mapreduce作业

Intellij IDEA远程向hadoop集群提交mapreduce作业&#xff0c;需要依赖到hadoop的库&#xff0c;hadoop集群的配置信息&#xff0c;还有本地项目的jar包。 一、软件环境 &#xff08;1&#xff09;window本地安装hadoop软件 首先将集群上的hadoop环境下载到本地&#xff0c;…

接口测试(备用)

音乐地址 http://k1998.xyz/php/public/index.php/index/music/lists 随机一个段子 https://autumnfish.cn/api/joke/list 随机十条段子(数字10可更改&#xff09; https://autumnfish.cn/api/joke/list?num10

Spring AOP知识点简介

文章目录1、什么是AOP1.1、AOP术语1.2、AOP框架2、动态代理2.1、JDK动态代理2.2、CGLIB动态代理3、基于代理类的AOP实现3.1、Spring的通知类型3.2、ProxyFactoryBean4、AspectJ开发4.1、基于XML的声明式AspectJ4.2、基于注解的声明式AspectJ1、什么是AOP 面向切面编程&#xf…

jzoj2940-生成输入数据【最小生成树,并查集】

正题 题目大意 给一个完全图的唯一一颗最小生成树&#xff0c;求完全图最小边权之和。 解题思路 我们考虑在计算最小生成树的时候&#xff0c;将两个联通块合并时&#xff0c;我们会选择连接这两个联通块的最小的边。 那么我们就可以让每个联通块合并时&#xff0c;让其他边都…

SQL2017 Azure SQL新功能:图形数据库

图形数据库是什么呢&#xff1f;如果从字面理解是进行图形处理的数据库&#xff0c;那么你就错了哈哈。 我们先来解释什么是图形数据库。 图形数据库是NoSQL数据库的一种类型&#xff0c;它应用图形理论存储实体之间的关系信息。最常见的例子&#xff0c;就是社会网络中人与人之…

git创建tag标签

创建标签 添加tag git tag v1.0 查看所有的tag版本 git tag 后可加-m添加注释 这时只能在本地可以看到自己新建Tag&#xff0c;在远程中央仓库中还是看不到在Tags下有如何内容&#xff0c;因为我们还没把它推送到中央仓库上 推送到远端 git push origin v1.0 如果没有和远程没…

idea中XML注释与取消注释快捷键

IntelliJ IDEA和eclipse中编辑Java文件时&#xff0c;注释和取消注释的快捷键都是&#xff1a; "CTRL / " 编辑xml文件时&#xff0c; 注释&#xff1a;CTRL SHIFT / 取消注释&#xff1a;CTRL SHIFT \

Hadoop入门(十三)远程提交wordCout程序到hadoop集群

一、项目结构 用到的文件有WordCount.java、core-site.xml、mapreduce-site.xml、yarn-site.xml、log4j.properties、pom.xml 二、项目源码 &#xff08;1&#xff09;WordCount.java package com.mk.mapreduce;import org.apache.hadoop.conf.Configuration; import org.ap…

jzoj3771-小Z的烦恼【高精度,数学】

正题 题目大意 mmm个盒子&#xff0c; 当第iii个盒子中放了xxx&#xff0c;那么i1i1i1个盒子中就必须放2x2x2x&#xff08;i<mi<mi<m&#xff09;。 求1∼n1\sim n1∼n&#xff0c;mmm个盒子&#xff0c;求第一个盒子中可以放多少个 解题思路 1号盒子中的肯定越小越好…

腾讯云短信服务使用记录与.NET Core C#代码分享

1、即使是相同的短信签名与短信正文模板&#xff0c;也需要针对“国内文本短信”与“海外文本短信”分别申请。开始不知道&#xff0c;以为只要申请一次&#xff0c;给国外手机发短信时给api传对应的国家码就行&#xff0c;后来才发现需要分别申请。 2、短信服务web api响应“手…

Vue动画效果

.v-enter,.v-leave-to {opacity: 0;transform: rotateY(120deg);}.v-enter-active,.v-leave-active {transition: all 1s ease;}<transition><div v-cloak v-show"flag"><span classbadge>李白 </span><span idinput-size>善良之人啊&…