Spring中IOC DI和AOP分别是什么

简介: Spring中IOC DI和AOP分别是什么

前言

什么是Spring boot, 为什么Spring boot在java领域这么流行

一说到这个问题, 那肯定要先从Spring讲起, 毕竟Spring boot实际上可以看做是Spring的扩展版, 在我的理解里, 用java的方式讲解Spring和Spring boot的话就是继承和被继承的关系

那么说到Spring, Spring的几个核心概念: 轻量级, AOP, IOC, DI又是不可忽视的, 本章就从Spring的几个核心概念为大家揭开Springboot的神秘面纱

Spring的核心概念

IOC(控制反转)

定义: IOC是一种设计思想, 被称为控制反转, 在Java开发中, 就是将原本手动创建对象的权利交由Spring框架进行管理

控制反转实际上就是当你想要创建对象的时候不自己去创建, 而是向Spring IOC容器发起请求, 告诉他我要创建哪个哪个对象了, 然后Spring IOC容器就会返回一个对象实例给你, 这就是IOC控制反转, 将创建对象的权利交由Spring IOC容器管理

优点:

  • 可以极大地简化应用的开发, 降低藕合
  • 对象由Spring IOC容器进行管理, 我们只需要配置好配置文件或注解就可以, 不用去关注对象的创建过程
  • 资源易管理

DI(依赖注入)

定义: 依赖注入是IOC控制反转的具体实现, 是实现用于解决依赖性设计模式

因为对象资源的获取全部要依赖于Spring IOC容器, 组件之间的依赖关系由容器在应用系统运行期来决定, 在需要的时候由Spring IOC容器动态地往组件中注入需要的实例对象,就叫依赖注入

AOP(面向切面)

定义: 面向切面编程, AOP是OOP(面向对象编程)的一种延续

AOP主要解决:

  • 在不改变原有业务逻辑的情况下, 增强横切逻辑代码
  • 根本上解耦合
  • 避免和企鹅逻辑代码重复

常见应用范围:

  • 处理日志
  • 安全管理
  • 事务管理

AOP的通知(advice):

  • 前置通知(Before): 在方法被调用之前执行
  • 后置通知(After): 目标方法完成之后调用通知
  • 返回通知(After-returning): 在目标方法完成之后调出通知, 不管成功还是失败
  • 异常通知(After-throwing): 在目标方法抛出异常之后通知
  • 环绕通知(Around): 通知环绕在方法前后, 自定义通知执行在方法前后的内容

和aop相似的拦截器, 过滤器, 三者的区别

过滤器, 拦截器拦截的是URL, AOP拦截的是类的元数据(包, 类, 方法名, 参数等)

三者的功能类似, 但是各有各的优势, 过滤器 -- > 拦截器 --> aop 拦截规则越来越细致, 执行的顺序依次是 过滤器 --> 拦截器 --> aop

around的demo

package com.ningxuan.demo.conifg;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import java.util.Arrays;
/**
 * aop测试
 */
@Aspect
@Component
public class AopConfig {
    /**
     * 环绕通知
     * 在com.yl.spring.aop.ArithmeticCalculator接口的每一个方法执行前后都执行一段代码
     * @param pjd   环绕通知必须有返回值, 返回值为目标方法的返回值
     */
    @Around("execution(public int com.ningxuan.demo.controller.TestController.*(..))")
    public Object roundTest(ProceedingJoinPoint pjd) {
        Object result = null;
        String methodName = pjd.getSignature().getName();
        //执行目标方法
        try {
            //前置通知
            System.out.println("The method " + methodName + " begins with " + Arrays.asList(pjd.getArgs()));
            result = pjd.proceed();
            //返回通知
            System.out.println("The method " + methodName + " ends with " + Arrays.asList(pjd.getArgs()));
        } catch (Throwable e) {
            //异常通知
            System.out.println("The method " + methodName + " occurs expection : " + e);
            throw new RuntimeException(e);
        }
        //后置通知
        System.out.println("The method " + methodName + " ends");
        return result;
    }
}
复制代码

总结

  • Spring通过IOC, AOP来简化java开发
  • Spring的IOC降低了组件间的耦合性
  • AOP天生适合做日志/事务等集中式处理, 提高了代码的复用性
  • Spring的生态及其完整, 是国内名副其实的大哥大



目录
相关文章
|
13天前
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
94 26
|
1月前
|
XML Java 开发者
Spring Boot中的AOP实现
Spring AOP(面向切面编程)允许开发者在不修改原有业务逻辑的情况下增强功能,基于代理模式拦截和增强方法调用。Spring Boot通过集成Spring AOP和AspectJ简化了AOP的使用,只需添加依赖并定义切面类。关键概念包括切面、通知和切点。切面类使用`@Aspect`和`@Component`注解标注,通知定义切面行为,切点定义应用位置。Spring Boot自动检测并创建代理对象,支持JDK动态代理和CGLIB代理。通过源码分析可深入了解其实现细节,优化应用功能。
|
2月前
|
XML Java 数据格式
【SpringFramework】Spring IoC-基于XML的实现
本文主要讲解SpringFramework中IoC和DI相关概念,及基于XML的实现方式。
116 69
|
13天前
|
XML Java 测试技术
Spring AOP—通知类型 和 切入点表达式 万字详解(通俗易懂)
Spring 第五节 AOP——切入点表达式 万字详解!
73 25
|
13天前
|
XML 安全 Java
Spring AOP—深入动态代理 万字详解(通俗易懂)
Spring 第四节 AOP——动态代理 万字详解!
66 24
|
2月前
|
Java Spring 容器
【SpringFramework】Spring IoC-基于注解的实现
本文主要记录基于Spring注解实现IoC容器和DI相关知识。
60 21
|
2月前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
1月前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
80 8
|
2月前
|
存储 Java 应用服务中间件
【Spring】IoC和DI,控制反转,Bean对象的获取方式
IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式
|
2月前
|
存储 缓存 Java
Spring面试必问:手写Spring IoC 循环依赖底层源码剖析
在Spring框架中,IoC(Inversion of Control,控制反转)是一个核心概念,它允许容器管理对象的生命周期和依赖关系。然而,在实际应用中,我们可能会遇到对象间的循环依赖问题。本文将深入探讨Spring如何解决IoC中的循环依赖问题,并通过手写源码的方式,让你对其底层原理有一个全新的认识。
74 2