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

2023-12-16 23:01

本文主要是介绍【日积月累】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.3 IOC的理解
  • 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.3 IOC的理解

IOC 控制反转:

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

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

在Spring中一般存在三级缓存,singletonObject存放完整的Bean对象,整个Bean的生命周期,从创建到使用到销毁全部都由容器来控制。
1.IOC容器的创建(beanFactory,DeafultListableBeanFactory),向bean工厂设置一些属性(BeanPostProcessor,Aware接口的子类)等属性
2.加载解析bean对象,准备创建的定义对象beanDefinition(xml或者注解的解析过程)
3.beanFactoryProcessor的处理,此处是扩展点(PlaceHolderConfigurSupport,ConfigurationClassPostProssor)
4.BeanPostProcessor的注册功能,方便后续对bean对象完成具体的扩展功能
5.通过反射的方式将BeanDefinition对象实例化成具体的bean对象
6.bean对象的初始化过程(填充属性,调用Aware子类的方法,调用BeanPostProcessor前置处理方法,调用init-method方法,调用BeanPostProcessor的后置处理方法)
7.生成完整的bean对象,通过getBean方法可以直接获取
8.销毁过程

4.参考

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

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

在这里插入图片描述

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



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

相关文章

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

Java中如何正确的停掉线程

《Java中如何正确的停掉线程》Java通过interrupt()通知线程停止而非强制,确保线程自主处理中断,避免数据损坏,线程池的shutdown()等待任务完成,shutdownNow()强制中断... 目录为什么不强制停止为什么 Java 不提供强制停止线程的能力呢?如何用interrupt停止线程s

SpringBoot请求参数传递与接收示例详解

《SpringBoot请求参数传递与接收示例详解》本文给大家介绍SpringBoot请求参数传递与接收示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录I. 基础参数传递i.查询参数(Query Parameters)ii.路径参数(Path Va

SpringBoot路径映射配置的实现步骤

《SpringBoot路径映射配置的实现步骤》本文介绍了如何在SpringBoot项目中配置路径映射,使得除static目录外的资源可被访问,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一... 目录SpringBoot路径映射补:springboot 配置虚拟路径映射 @RequestMapp

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

RabbitMQ 延时队列插件安装与使用示例详解(基于 Delayed Message Plugin)

《RabbitMQ延时队列插件安装与使用示例详解(基于DelayedMessagePlugin)》本文详解RabbitMQ通过安装rabbitmq_delayed_message_exchan... 目录 一、什么是 RabbitMQ 延时队列? 二、安装前准备✅ RabbitMQ 环境要求 三、安装延时队

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2