【日积月累】Spring中的AOP与IOC相关问题详解

2023-12-13 11:12

本文主要是介绍【日积月累】Spring中的AOP与IOC相关问题详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Spring中的AOP与IOC

  • 1.前言
  • 2.Spring AOP(面向切面编程)
    • 2.1 AOP的实现过程
    • 2.2 AOP代理模式的类型
      • 2.2.1JDK的动态代理
      • 2.2.2CGLIB的动态代理
    • 2.3AOP应用常见场景
      • 2.3.1日志记录
    • 2.4对AOP的理解
  • 3.Spring IOC(Inversion of Control,控制反转)
    • 3.1使用Spring IOC 的好处
    • 3.2使用Spring IOC 依赖注入的方式
      • 3.2.1通过xml文件注入
      • 3.2.2通过注解注入
    • 3.3IOC的理解
  • 4.参考


文章所属专区 日积月累


1.前言

本文主要针对Spring中两大特性,AOP和IOC,并针对他们的使用常见,结合面试常见问题,实现代码,进行解析。

2.Spring AOP(面向切面编程)

在使用Java语言进行代码编写时,由于Java语言的特性,会有一些弊端,比如在处理一些不具有继承关系的一些类的公共行为时,只能在每个对象引用公共行为,会出现大量重复代码,会造成大量代码冗余,这样不仅浪费时间,也不方便维护,AOP的出现解决了这一个问题。

2.1 AOP的实现过程

Spring中的AOP基于代理模式,首先会自定义一个注解;
其次,定义一个切面(Aspect)类,在切面中定义切点和通知,切点(方法的拦截规则),在使用了这个注解的方法会被拦截下来,拦截下来之后;
最后可以进行前置通知、后置通知、异常通知、返回通知还是环绕通知等。

2.2 AOP代理模式的类型

代理类可以分为两类 动态代理(Dynamic Proxy)和静态代理(Static Proxy)Spring AOP(面向切面编程)中主要是运用了动态代理的方式来实现:在运行过程中通过反射机制动态创建而成,无需手动编写代码。

2.2.1JDK的动态代理

JDK动态代理是Spring AOP默认使用的方式,主要用于对实现了接口的类生成代理。JDK动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。InvocationHandler是一个接口,通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编制在一起。Prox则利用InvocationHandler动态创建一个符合某一接口的实例,生成目标类的代理对象

2.2.2CGLIB的动态代理

CGLIB(Code Generation Library)是针对类实现代理的,主要是对指定的类生成一个子类,覆盖其中的方法(继承)。CGLIB是一个强大的高性能,高质量的代码生成类库,可以在运行期扩展Java类与实现Java接口。CGLIB封装了asm,可以再运行期动态生成新class

2.3AOP应用常见场景

比如日志记录,性能优化,权限控制,内容传递,错误处理,事务管理,限流等。

2.3.1日志记录

在Spring AOP中,可以使用@AspectJ注解定义一个切面,然后在切面方法中添加@Before或@After注解,用于在方法执行前后插入相应的日志记录逻辑

2.4对AOP的理解

AOP是Spring框架中最核心的两个点之一,它可以减少重复代码,降低模块间的耦合性,提高代码的可操作性和可维护性。在实际工作中,除了业务代码之外,还经常会接触到与业务无关的一些组件,比如日志,权限,事务等常见的核心服务组件,如果为每个业务代码单独添加这些组件,会出现大量的冗余代码,因此我们将这些公共的代码逻辑抽象出来成为一个切面,然后注入到具体业务中去。AOP就是通过这样一种方式,通过动态代理的方式,来对需要注入切面的对象进行代理,在进行调用时,直接将公共逻辑添加进去,而不需要修改原有的业务代码,在不改变原有业务代码的情况下做了代码功能的增强。

3.Spring IOC(Inversion of Control,控制反转)

在传统的软件设计过程中,通常由调用者来创建被调用者的实例。但在Spring中创建被调用者的工作不在由调用者来完成,这就是控制反转。IOC是一种设计思想,即把原本在程序中手动创建对象的控制权交给了Spring框架中的IOC容器,让它去创建和管理这些对象。在Spring中实现IOC主要依靠DI(Dependency Injection 依赖注入) 来实现。

3.1使用Spring IOC 的好处

在 Spring 中, IoC 容器是 Spring 用来实现 IoC 的载体, IoC 容器实际上就是个 Map(key,value),Map 中存放的是各种对象。

  1. 由于资源不再由使用资源的双方管理,因此,资源可以集中管理,实现资源的可配置和易管理
  2. 降低了使用资源双方的依赖程度(低耦合度)。

3.2使用Spring IOC 依赖注入的方式

3.2.1通过xml文件注入

属性注入(property)、构造器注入(constructor-arg)、自动装配通过对bean的autowrite属性指定(byName、byType)

3.2.2通过注解注入

这种方式后来在 SpringBoot 中常用 ,@autowrite @resource @component等

3.3IOC的理解

IOC 控制反转:

在没有使用IOC容器之前,都是由程序员来控制对象,而有了IOC容器之后,则由IOC容器来控制对象;
控制的是实现过程中所需要的对象以及依赖的对象;
在没有使用IOC之前,我们都需要主动在对象中创建依赖的对象,这种正转的,而有了IOC之后,依赖的对象由IOC创建后注入到对象中,由主动创建变成了被动接受,这是反转;
IOC是一种思想,DI(依赖注入:把对应的属性的值注入到对象)是具体的实现方式 @AutoWried

IOC 容器(Spring用来实现IOC的载体,实际是个Map(Key,value),Map中存放的是各种对象):

在Spring中一般存在三级缓存,singletonObject存放完整的Bean对象,整个Bean的生命周期,从创建到使用到销毁全部都由容器来控制。

4.参考

谈谈对IOC的理解
Spring AOP的理解与使用
面试被问了几百遍的 IoC 和 AOP ,还在傻傻搞不清楚?

给个三连吧 谢谢谢谢谢谢了

在这里插入图片描述

这篇关于【日积月累】Spring中的AOP与IOC相关问题详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/488258

相关文章

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

javacv依赖太大导致jar包也大的解决办法

《javacv依赖太大导致jar包也大的解决办法》随着项目的复杂度和依赖关系的增加,打包后的JAR包可能会变得很大,:本文主要介绍javacv依赖太大导致jar包也大的解决办法,文中通过代码介绍的... 目录前言1.检查依赖2.更改依赖3.检查副依赖总结 前言最近在写项目时,用到了Javacv里的获取视频

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

Redis 的 SUBSCRIBE命令详解

《Redis的SUBSCRIBE命令详解》Redis的SUBSCRIBE命令用于订阅一个或多个频道,以便接收发送到这些频道的消息,本文给大家介绍Redis的SUBSCRIBE命令,感兴趣的朋友跟随... 目录基本语法工作原理示例消息格式相关命令python 示例Redis 的 SUBSCRIBE 命令用于订

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC