当前位置: 首页 > news >正文

Spring基础之——控制反转(IOC)、依赖注入(DI)与切面编程(AOP)概念详解(适合小白,初学者必看)

前言

        本篇博客讲详细介绍Spring框架中的两个最核心且最基础的概念:控制反转(IOC)和面向切面编程(AOP)。以及如何通过IDEA来构建一个Spring项目,通过实战和理论结合的方式来让大家真的学会Spring这个最流行的Java框架。

一、认识Spring(是什么)

1. Spring框架的概述

        Spring是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。

        它是为了解决企业应用开发的复杂性而创建的。

Spring的核心是控制反转(IOC)和面向切面(AOP):

  • IOC:控制反转,将创建对象的过程交给spring进行管理.
  • AOP:面向切面,在不修改源代码的情况之下进行代码功能的增强.

2. Spring框架的优点

  • 方便解耦,简化开发,Spring就像一个大工厂,将所有对象的创建和依赖关系维护,交给Spring管理,这也是IOC的作用。
  • AOP编程的支持,Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能。
  • 声明式事务的支持,只需要通过配置就可以完成对事务的管理,而无需手动编程。
  • 方便程序的测试,Spring支持Junit4,可以通过注解方便的测试Spring程序。
  • 方便集成各种优秀框架,Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts2、Hibernate、MyBatis等)的直接支持。
  • 降低JavaEE API的使用难度,Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail等),都提供了封装,使这些API应用难度大大降低。

二、Spring项目的创建

如今IDEA比较主流,下面我来演示如何使用IDEA来创建一个Spring项目。

1. 首先我们创建一个Maven工程

不知道如何创建Maven工程的小伙伴,请参考我的这篇博客:

Maven学习—如何在IDEA中配置Maven?又如何创建Maven工程?(详细攻略)_idea创建maven项目-CSDN博客

2. 引入Spring相关的依赖坐标

Spring框架基础依赖:

<dependencies>
<!--    Spring框架基础依赖    --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.2.RELEASE</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><!-- 日志 --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency><!-- 单元测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency></dependencies>

AOP面相切面编程的依赖: 

<!--  AOP面相切面编程的依赖 --><!--AOP联盟--><dependency><groupId>aopalliance</groupId><artifactId>aopalliance</artifactId><version>1.0</version></dependency><!--Spring Aspects--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.0.2.RELEASE</version></dependency><!--aspectj--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.3</version></dependency>
3. 创建Spring核心的配置文件 

在resources目录下创建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"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"></beans>

以上内容,就是一个最基础的Spring项目的创建方法。

三、Spring IOC容器

1. 什么是IOC

IOC (Inverse of Control),控制反转,将对象的创建权力交给给Spring框架去管理,实现控制权的反转。

2. IOC实现的底层原理

IOC的实现,依赖于以下3种技术

  • ① dom4j解析xml文档;
  • ② Java对象的一种创建方式:工厂模式;
  • ③ 采用Java中反射技术来创建对象

想要了解对底层原理深入了解的小伙伴,可以去Spring官网下载Spring底层源码。

Spring官方网站  Spring | HomeLevel up your Java code and explore what Spring can do for you.icon-default.png?t=O83Ahttps://spring.io/

ioc底层有用到反射,面试时如果可以扯一扯Java基础反射相关的东西; 

3、IOC的具体使用

常规情况下,类A中使用类C示意图:

当有了IoC/DI的容器后,A类不再主动去创建C了,
而是被动等待,等待IoC/DI的容器获取一个C的实例,然后反向的注入到A类中,如下图所示:

                                               有IoC/DI容器后程序结构示意图

      

  1. 控制反转(IOC):是从容器的角度出发,既:容器控制应用程序,由容器反向的向应用程序注入其所需要的外部资源。

  2. 依赖注入(DI):是从应用程序的角度在描述,既:应用程序依赖容器创建并注入它所需要的外部资源;

         根据上面的讲述,应该能看出来,DI和IOC是对同一件事情的不同描述,从某个方面讲,他们就是同一概念,只是描述的角度不同。

        当然对于我们初学者,我们首先去掌握spring IOC的使用方法即可;下面我来用基础代码为大家演示:Spring的控制反转和依赖注入两大设计理念的含义:

代码演示:

(1)通过IOC来创建Java类

①首先我先定义几个普通的Java类:

Teacher类:

 User类:

 通常情况下,我们若想要去创建这两个类的对象的话,会像下面这样:

  • 使用最普通New的方式
  • 使用反射的方式创建对象
    public void createObjTest01() throws ClassNotFoundException {//1.使用最普通new的方式User user = new User();//2.使用反射的方式创建对象(需要在方法上抛出“找不到类”的异常)Class clazz = Class.forName("com.yzx.pojo.User");}

 ②但如果我们使用了Spring,我们创建对象的方式将发生改变,演示如下:

首先,在Spring的xml配置文件中进行bean注入:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"><bean id="user" class="com.yzx.pojo.User"></bean><bean id="Teacher" class="com.yzx.pojo.Teacher"></bean></beans>
  •  id  后面是你自定义该类的别名;
  • class 后面是你要托管给Spring管理的类的全路径;

然后,我们在test目录下创建一个测试类,来验证Spring是否已经可以管理这两个类。

 测试类中的测试方法内容如下:

@Testpublic void createObjTest02() throws ClassNotFoundException {//1.首先加Spring的载配置文件ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");//2.然后通过ApplicationContext的对象来获取所需对象User user = (User)ac.getBean("user");Teacher teacher = (Teacher)ac.getBean("teacher");usr.test();teacher.test();}

   运行结果:

 

(2)通过IOC向类注入属性值

首先我们在Spring配置文件中为对象注入属性值

方法一:使用<property>标签来实现对属性的注入,

1.使用<property>标签来实现对属性的注入,使用该标签进行属性注入时,要求pojo类中必须配有setter方法,因此,该方法通常叫做使用setter方法注入2.标签属性:
name:类中的属性名称
value:向属性注入的值
ref:对象映射

代码如下:

<bean id = "usr" class="com.yzx.pojo.User"><!--  ①配置基本类型的属性值   --><property name="id" value="1"/><property name="username" value="admin"/><property name="password" value="123"/><!--  ②配置数组类型的属性值   --><property name="strs"><array><value>admin</value><value>张三</value><value>李四</value></array></property><!--  ③配置List集合类型的属性值   --><property name="list"><list><value>熊大</value><value>熊二</value></list></property><!--  ④配置map集合类型的属性值   --><property name="map"><map><entry key="aaa" value="小白"/><entry key="bbb" value="小黑"/></map></property></bean>

方法二:使用<property>标签来实现对属性的注入,

1.使用<constructor-arg>标签来实现对属性的注入,使用该标签进行属性注入时,要求pojo类中必须配有构造器,因此,该方法通常也叫做利用类的构造器注入。2.标签属性:
name:类中的属性名称
value:向属性注入的值
ref:对象映射
<bean id="teacher" class="com.yzx.pojo.Teacher"><!--  ①配置基本类型的属性值   --><constructor-arg name="id" value="1"/><constructor-arg name="tname" value="李老师"/><!--  ②配置数组类型的属性值   --><constructor-arg name="nums"><array><value>1</value><value>2</value><value>3</value><value>4</value></array></constructor-arg><!--  ③配置List集合类型的属性值   --><constructor-arg name="list"><list><value>"你好"</value><value>"spring"</value></list></constructor-arg><!--  ④配置map集合类型的属性值   --><constructor-arg name="map"><map><entry key="张三" value="12"/><entry key="李四" value="15"/></map></constructor-arg></bean>

测试代码:

@Testpublic void createObjTest02() throws ClassNotFoundException {//1.首先加Spring的载配置文件ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");//2.然后通过ApplicationContext的对象来获取所需对象User user = (User)ac.getBean("usr");Teacher teacher = (Teacher)ac.getBean("teacher");System.out.println(user.toString());System.out.println(teacher.toString());}

运行结果:

小结:

通过上述演示,相信大家对Spring框架中IOC和DI的概念有了基础的认识;

        其实IoC/DI对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本具有最大的主动权,需要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC/DI容器来创建并注入应用程序所需要的资源了。
        这样一个改变其实是编程思想的一个大进步,如此就可以有效的分离了对象和它所需要的外部资源,使得代码的耦合度降低,有利于代码复用,更重要的是使得程序的整个体系结构变得非常灵活。

四、Spring AOP面向切面编程

由于篇幅有限,AOP的具体内容请看小编下面的这篇博客

本文参考文献:

控制反转(IOC)和依赖注入(DI)的区别(详细 通俗易懂解释)_控制反转和依赖注入的理解(通俗易懂)-CSDN博客

相关文章:

Spring基础之——控制反转(IOC)、依赖注入(DI)与切面编程(AOP)概念详解(适合小白,初学者必看)

前言 本篇博客讲详细介绍Spring框架中的两个最核心且最基础的概念&#xff1a;控制反转&#xff08;IOC&#xff09;和面向切面编程&#xff08;AOP&#xff09;。以及如何通过IDEA来构建一个Spring项目&#xff0c;通过实战和理论结合的方式来让大家真的学会Spring这个最流行的…...

java排序算法汇总

一、排序算法我介绍 1.1、介绍 排序也称排序算法(Sort Algorithm)&#xff0c;排序是将一组数据&#xff0c;依指定的顺序进行排列的过程。 1.2、排序的分类&#xff1a; 1) 内部排序&#xff1a;指将需要处理的所有数据都加载到内部存储器中进行排序。 2) 外部排序法&…...

游戏引擎中LOD渲染技术

一.LOD(Level Of Detail) 为了降低GPU渲染压力,根据摄像机距离模型距离将面数较高的模型替换为面数较低的模型. LOD LOD0(distance<10) LOD1(distance<20) LOD2(distance<30) 故通常引擎中MetaMesh是由一个或多个LOD模型构成. MetaMesh mesh mesh.lod1 mesh.lod…...

【MacOS开发环境配置与应用开发--详细教程】

在macOS上进行应用开发&#xff0c;通常使用Xcode作为主要开发环境&#xff0c;Xcode集成了所有必需的工具和资源&#xff0c;支持多种编程语言&#xff0c;如Swift、Objective-C、C等。 MacOS开发环境配置与应用开发 1. 安装Xcode1.1 安装方法1.2 验证安装1.3 配置命令行工具…...

【回溯法】——组合总数

回溯核心思想 回溯算法的关键在于&#xff1a;不合适就退回到上一步具体的&#xff1a;通过枚举法&#xff0c;对所有可能性进行遍历&#xff0c;枚举顺序是一条路走到黑&#xff0c;走到头满足条件后&#xff0c;退一步&#xff0c;再尝试之前没走过的路&#xff0c;直到所有…...

JavaScript 自动化软件:AutoX.js

<div id"content_views" class"htmledit_views" deep"6"><p></p>...

探索Scala编程:图书管理系统实战

在这篇文章中&#xff0c;我们将通过一个简单的图书管理系统项目来深入理解Scala编程。这个项目不仅会帮助你掌握Scala的基本操作&#xff0c;还会让你了解如何使用Scala来处理实际问题。准备好了吗&#xff1f;让我们开始吧&#xff01; 项目目标 我们的目标是创建一个图书管…...

Java之遍历List集合安全地删除元素

Java之遍历List集合安全地删除元素 在Java中&#xff0c;遍历一个List并安全地删除元素是一个需要注意的问题。因为直接在遍历过程中修改集合&#xff08;如删除元素&#xff09;可能会导致ConcurrentModificationException异常。这是因为集合的迭代器在检测到集合在迭代过程中…...

ceph的集群管理

0 环境说明 ip地址主机名额外硬盘是否加入ceph集群10.0.0.141ceph141sdb 300G&#xff0c;sdc 500G是10.0.0.142ceph142sdb 300G&#xff0c;sdc 500G, sdd 1000G否10.0.0.143ceph143sdb 300G&#xff0c;sdc 500G否 在上一篇文章中&#xff0c;已经成功地初始化了一个ceph管…...

STM32 设计的较为复杂的物联网项目,包括智能家居控制系统,涵盖了硬件和软件的详细设计。

使用 STM32 设计的较为复杂的物联网项目&#xff0c;包括智能家居控制系统&#xff0c;涵盖了硬件和软件的详细设计。 一、硬件设计 微控制器&#xff1a;选择 STM32F4 系列微控制器&#xff0c;如 STM32F407ZGT6&#xff0c;具有高性能和丰富的外设资源。 传感器模块&#x…...

Kettle配置数据源错误“Driver class ‘org.gjt.mm.mysql.Driver‘ could not be found”解决记录

问题描述 错误提示&#xff1a;“Driver class ‘org.gjt.mm.mysql.Driver’ could not be found, make sure the ‘MySQL’ driver (jar file) is installed.” 原因分析&#xff1a; 根据错误提示是缺少了相关的数据源连接jar包。 解决方案&#xff1a; 安装对应的Mysql…...

二分搜索的三种方法

首先总的说一下二分搜索。如果区间具有二分性&#xff0c;这个二分性不仅仅是指区间是有序的&#xff0c;而是我们可以通过某一种性质将整个区间分成左区间和右区间。我们通过二分的方法去不断缩小查找的区间&#xff0c;最终让区间内没有元素&#xff0c;这个时候的我们就得到…...

使用python编写工具:快速生成chrome插件相关文件结构

本文将详细分析一段用 wxPython 编写的 Python 应用程序代码。该程序允许用户创建一些特定文件并将它们保存在指定的文件夹中&#xff0c;同时也能够启动 Google Chrome 浏览器并打开扩展页面&#xff0c;自动执行一些操作。 C:\pythoncode\new\crxiterationtaburl.py 全部代码…...

内存、显存和GPU在Transformer架构中承担什么计算任务

目录 内存、显存和GPU在Transformer架构中承担什么计算任务 一、内存、显存和GPU的区别 二、在Transformer架构中的计算任务 内存、显存和GPU在Transformer架构中承担什么计算任务 是计算机系统中重要的组成部分,它们在Transformer架构中承担着不同的计算任务。以下是对这…...

【计算机网络】TCP协议特点3

心跳机制 什么是心跳机制 心跳机制是在计算机系统、网络通信和许多其他技术领域广泛应用的一种机制&#xff0c;用于检测两个实体之间的连接是否仍然活跃&#xff0c;或者设备是否还在正常运行。就是每隔一段时间发送一个固定的消息给服务端&#xff0c;服务端回复一个固定…...

移植LVGL8.2以及移植过程的理解

一、LVGL刷新显示&#xff08;画点 OR 区域刷新颜色&#xff09; 原来LCD的区域填充&#xff0c;由于没用到DMA就是普通的遍历区域块的坐标&#xff0c;需要传入的坐标就是显示区域的x轴起始与x轴尾部。y轴的起始与y轴的尾部。 怎么实现呢&#xff1f; SPI不加DMA实现区域填充…...

动态规划-背包问题——1049.最后一块石头的重量II

1.题目解析 题目来源 1049.最后一块石头的重量II——力扣 测试用例 2.算法原理 首先需要将该问题转化为0-1背包问题后再做分析 1.状态表示 根据数学中的知识我们知道将一个数字分为两个子数后求这两个子数的最小差值&#xff0c;那么就要求这两个子数尽可能接近于原数字的一…...

【C++学习(37)】并发性模式:如生产者-消费者、读写锁等。 架构模式:如MVC、MVVM等。属于23 种设计模式吗? RAII 的关系?

并发性模式(如生产者-消费者、读写锁等)和架构模式(如 MVC、MVVM 等)并不属于 Gang of Four(GoF) 提出的 23 种经典设计模式 中。这些模式是其他领域中的设计模式,虽然它们和 GoF 的设计模式有交集,尤其是在程序架构和资源管理方面,但并不直接包含在 GoF 的 23 种设计…...

[Mysql] Mysql的多表查询----多表关系(下)

4、操作 方式二&#xff1a;创建表之后设置外键约束 外键约束也可以在修改表时添加&#xff0c;但是添加外键约束的前提是&#xff1a;从表中外键列中的数据必须与主表中主键列中的数据一致或者是没有数据。 语法&#xff1a; alter table <从表名> add constr…...

命名空间(namespace)详解(一)

域 在学习命名空间之前&#xff0c;我们首先要了解几种常见的域 一、域的种类 1、类作用域 类作用域是指定义在类内部的成员&#xff08;包括数据成员和成员函数&#xff09;的可见性和访问权限的范围 代码示例&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1#include &…...

原来选对床垫竟然这么重要?2026年内行都推荐这几款

原来选对床垫竟然这么重要&#xff1f;2026年内行都推荐这几款在追求高质量生活的今天&#xff0c;一个舒适的睡眠环境变得越来越重要。而床垫作为睡眠质量的关键因素之一&#xff0c;选择一款合适的床垫显得尤为重要。本文将探讨如何选择适合自己的床垫&#xff0c;并推荐几款…...

三分钟解锁Windows 11任务栏:Taskbar11让你的桌面重获自由

三分钟解锁Windows 11任务栏&#xff1a;Taskbar11让你的桌面重获自由 【免费下载链接】Taskbar11 Change the position and size of the Taskbar in Windows 11 项目地址: https://gitcode.com/gh_mirrors/ta/Taskbar11 还在为Windows 11那固执的任务栏设置感到束手无策…...

独立开发者如何借助Taotoken多模型能力优化个人项目成本

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 独立开发者如何借助Taotoken多模型能力优化个人项目成本 对于独立开发者和小型项目而言&#xff0c;在探索大模型应用时&#xff0…...

5分钟掌握Windows虚拟显示器:Rust驱动扩展多屏工作空间实用指南

5分钟掌握Windows虚拟显示器&#xff1a;Rust驱动扩展多屏工作空间实用指南 【免费下载链接】virtual-display-rs A Windows virtual display driver to add multiple virtual monitors to your PC! For Win10. Works with VR, obs, streaming software, etc 项目地址: https…...

KLayout 0.30.0:如何用这款专业版图工具提升你的集成电路设计效率

KLayout 0.30.0&#xff1a;如何用这款专业版图工具提升你的集成电路设计效率 【免费下载链接】klayout KLayout Main Sources 项目地址: https://gitcode.com/gh_mirrors/kl/klayout 如果你正在寻找一款既强大又灵活的开源集成电路版图查看与编辑工具&#xff0c;KLayo…...

终极免费Steam创意工坊下载器:3分钟快速上手WorkshopDL完整指南

终极免费Steam创意工坊下载器&#xff1a;3分钟快速上手WorkshopDL完整指南 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在Epic Games Store或GOG平台购买了游戏&…...

【免费下载】 新魔百和M301H-CW代工系列强刷固件:当贝桌面纯净版安卓系统

新魔百和M301H-CW代工系列强刷固件&#xff1a;当贝桌面纯净版安卓系统 【下载地址】16-001-T-新魔百和M301H-CW代工-Hi3798MV300-MV310通用强刷固件当贝桌面纯净版安卓系统 本资源包专为新魔百和M301H-CW代工系列设备设计&#xff0c;适用于Hi3798MV300和MV310芯片组的智能电视…...

基于Adafruit Trinket与旋转编码器制作USB物理音量旋钮

1. 项目概述与核心价值作为一个常年泡在电脑前&#xff0c;需要频繁切换音乐、会议和视频的开发者&#xff0c;我发现自己每天点击系统音量图标的次数多得离谱。那种在关键时刻需要快速调低音量&#xff0c;却不得不移动鼠标、寻找小图标的操作&#xff0c;不仅打断了工作流&am…...

项目介绍 基于java+vue的校园舆情监测与预警系统设计与实现(含模型描述及部分示例代码)专栏近期有大量优惠 还请多多点一下关注 加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢

基于javavue的校园舆情监测与预警系统设计与实现的详细项目实例 请注意此篇内容只是一个项目介绍 更多详细内容可直接联系博主本人 或者访问对应标题的完整博客或者文档下载页面&#xff08;含完整的程序&#xff0c;GUI设计和代码详解&#xff09; 校园舆情监测与预警系统…...

Windows Cleaner终极指南:3分钟解决C盘爆满,让电脑重获新生![特殊字符]

Windows Cleaner终极指南&#xff1a;3分钟解决C盘爆满&#xff0c;让电脑重获新生&#xff01;&#x1f680; 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服&#xff01; 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 你是…...