(三)Spring教程——依赖注入与控制反转

        Spring框架是为了简化企业级应用开发而创建的,其强大之处在于对Java SE和Java EE开发进行全方位的简化,Spring还对常用的功能进行封装,可以极大地提高Java EE的开发效率。

        依赖注入是Spring的核心技术之一,也被称为“控制反转”,借助依赖注入技术,我们可以很方便地实现调用者和被调用者的分解,解耦类与类之间的关系。

        依赖注入(DI)指组件之间依赖关系由容器在运行期决定,即由容器动态地将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提高组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无须修改任何代码,也无需在意资源来自何处、由谁实现,就可以指定目标需要的资源,完成自身的业务逻辑。

        控制反转(IoC)并不是什么具体的技术,而是一种设计思想。在Java开发中通过IoC,将原本由程序代码直接操控的组件对象交由容器来操控,通过容器来实现组件对象的装配和管理。所谓“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器。

        依赖注入和控制反转是同一个概念的不同角色描述,由于控制反转概念比较含糊(可能只是理解到容器控制对象这一个层面,很难让人想到由谁来维护对象关系),所以2004年Martin Fowler又给出了一个新的名字——依赖注入。相对控制反转而言,依赖注入明确描述了“被注入对象依赖控制反转容器来配置依赖对象”。依赖注入的具体含义是:当某个角色(调用者,可能是一个Java实例)需要另一个角色(被调用者,另一个Java实例)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring中,被调用者的创建工作不再由调用者来完成,因此这也被称作控制反转;被调用者实例的创建工作通常由Spring容器来完成,因此这也被称作依赖注入。

        在编写传统的Java应用代码时,我们一般是直接在对象内部通过new来创建对象,让程序主动去创建依赖对象,这就是一个“谁使用,谁创建”的过程,创建依赖对象的主动权和创建时机都是由自己来把控。

        下面用示例来说明传统的Java应用代码是怎么来创建对应并使用对象中的属性和方法。

        首先创建一个Demo1.java类,该类的代码如下所示

package com.example.servlet001;public class Demo1 {public static void main(String[] args) {Person person=new Person();person.sayHello();}}class Person{public void sayHello(){System.out.println("hello");}}

        运行该类后的输出如下图所示

        可以看到Demo1类和Person类之间存在着强耦合,Person类和方法修改时,Demo1类的代码也需要修改。

        而在Spring中,可以通过IoC容器动态地将某个依赖关系注入到组件之中。

      Spring有两个重要的接口:BeanFactory和ApplicationContext,所谓的容器就是实现了BeanFactory接口或者是ApplicationContext接口的类的实例,BeanFactory是最顶层、最基本的接口,它描述了容器需要实现的最基本的功能,比如对象的注册、获取等。

        ApplicationContext接口继承了BeanFactory接口,拥有BeanFactory接口的全部功能,还继承了ApplicationEventPublisher接口、ResourceLoader接口、MessageSource接口,提供应用事件发布、资源加载和国际化功能。在实际应用中,这些功能使得ApplicationContext接口比BeanFactory接口更加方便。

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

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

相关文章

每日两题 / 437. 路径总和 III 105. 从前序与中序遍历序列构造二叉树(LeetCode热题100)

437. 路径总和 III - 力扣(LeetCode) 前序遍历时,维护当前路径(根节点开始)的路径和,同时记录路径上每个节点的路径和 假设当前路径和为cur,那么ans 路径和(cur - target)的出现次数 /*** D…

RAG 面向 LLM: 基于检索增强的大语言模型调研

摘要 作为 AI 领域最先进的技术之一,检索增强生成(RAG)技术可以提供可靠和最新的外部知识,为众多任务提供巨大的便利。特别是在 AI 生成内容(AIGC)时代,RAG 中检索强大的提供额外知识的能力使得检索增强生成能够辅助现有生成式 AI 生产高质量输出。最近,大语言模型(LLM)在语言…

110份财务常用excel模板(个税、采购、报销、预算),超实用!

如果你还在为报表头疼,那你一定不能错过这篇干货满满的分享! 个税报表 个人所得税,听起来就头大?别担心,掌握这些技巧,轻松搞定! - 记录员工收入,确保数据准确无误 - 计算应纳税…

达梦sql中参数个数太多导致出现SOH等特殊字符报错无效的序列号是不是达梦的bug

mybatis的Mapper.xml中如下: in中的参数大概有1万6千多个,分成每1000个一组拼接成sql,然而在达梦中执行时报如下: Caused by: dm.jdbc.driver.DMException: Invalid sequence noat dm.jdbc.driver.DBError.throwException(DBError.java:710)…

【NodeMCU实时天气时钟温湿度项目 7】和风天气API返回JSON数据信息的解压缩实现——ArduinoUZlib功能库

今天是第七专题,主要内容是:导入ArduinoUZlib功能库,借助该库把从【和风天气】官网返回的经过Gzip压缩的JSON数据,进行解压缩和t解析,在串口监视器上输出解析后的JSON信息。 如您需要了解其它专题的内容,请…

C++面向对象程序设计-北京大学-郭炜【课程笔记(八)】

C面向对象程序设计-北京大学-郭炜【课程笔记(八)】 1、虚函数和多态的基本概念1.1、虚函数1.2、多态多态的表现形式一多态的表现形式二 2、多态实例:魔法门之英雄无敌2.1、**非多态的实现方法:**2.2、**多态的实现方法** 3、多态实…

废品回收微信小程序基于FastAdmin+ThinkPHP+UniApp(源码搭建/上线/运营/售后/更新)

一款基于FastAdminThinkPHPUniApp开发的废品回收系统,适用废品回收站、再生资源回收公司上门回收使用的小程序。 一、FastAdmin框架特色功能及优势 模块化开发:控制器、模型、视图、JS一一对应,使用RequireJS进行插件机制,支持插…

5.13网络编程

只要在一个电脑中的两个进程之间可以通过网络进行通信那么拥有公网ip的两个计算机的通信是一样的。但是一个局域网中的两台电脑上的虚拟机是不能进行通信的,因为这两个虚拟机在电脑中又有各自的局域网所以通信很难实现。 socket套接字是一种用于网络间进行通信的方…

JavaEE之线程(5)——Java内存模型、内存可见性、volatile关键字

前言 volatile可以理解成轻量级的 synchronized, 它在多CPU开发中保证了共享变量的“可见性”,可见性我们可以理解成是:当一个线程修改一个共享变量时,另一个线程可以读到这个修改的值。由于它不会引起线程的上下文切换和调度&am…

第四届辽宁省大学生程序设计竞赛

比赛经历:2024.5.14简单vp了一个小时只写出了签到题4个然后跑路了 补题:感觉其他题有点太抽象了主要补了一题,在区间问题中数据结构的使用 比赛链接[点我即可] 目录 A.欢迎来到辽宁省赛 B.胜率 F.隔板与水槽 H.取石子 L.区间与绝对值 …

如何给扫描好的3d模型贴图?---模大狮模型网

在数字化设计领域,3D模型的贴图是提升模型逼真度和视觉效果的重要步骤之一。尤其是对于扫描好的3D模型,通过添加适当的贴图,不仅可以增强模型的细节和真实感,还可以为设计带来更加生动的视觉体验。本文将为您详细介绍如何给扫描好…

Node.js 学习笔记 express框架

express express 使用express下载express 初体验 express 路由什么是路由1路由的使用验证的方法 2获取请求报文参数3获取路由参数4响应设置响应报文 express 中间件5中间件全局中间件路由中间件 6静态资源中间件注意事项案例 7请求体数据8防盗链实现防盗链 9路由模块化router E…