跳至主要內容

EkkoSonya's Blog

好好学习,天天向上

Spring系列八股10 - AOP2 (织入方式)

AOP2

Spring AOP 织入方式

Spring AOP 是在运行时通过动态代理来实现织入的,当我们从 Spring 容器中获取 Bean 的时候,如果这个 Bean 需要被切面处理,Spring 就会返回一个代理对象给我们。

即在那个 bean 工厂里放到就是对应代理对象,真实对象被包在代理里面,只有 jp.proceed() 调用时才会触达它

织入有三种主要方式,按照它们的执行时机来区分

运行时织入 (动态代理)

运行时织入是我们在 Spring 中最常见的方式,也就是通过动态代理来实现


codejavaspring八股大约 4 分钟
Spring系列八股11 - AOP3

AOP3

Spring AOP 通知方式

Spring AOP 提供了多种通知方式,允许我们在方法执行的不同阶段插入逻辑。常用的通知方式有:

  • 前置通知 (@Before)
  • 返回通知 (@AfterReturning)
  • 异常通知 (@AfterThrowing)
  • 后置通知 (@After)
  • 环绕通知 (@Around)

codejavaspring八股大约 4 分钟
Spring系列八股12 - AOP4 (JDK动态代理和CGLIB代理)

AOP4

AOP 和反射的区别

反射主要是为了让程序能够检查和操作自身的结构,比如获取类的信息、调用方法、访问字段等等

而 AOP 则是为了在不修改业务代码的前提下,动态地为方法添加额外的行为,比如日志记录、事务管理等

从技术实现来说,反射是 Java 语言本身提供的功能,通过 java.lang.reflect 包下的 API 来实现

而 AOP 通常需要框架支持,比如 Spring AOP 是通过动态代理实现的,而动态代理又是基于反射实现的

JDK动态代理和CGLIB代理


codejavaspring八股大约 6 分钟
Spring系列八股7 - IOC1

IOC

介绍

IoC 的全称是 Inversion of Control,也就是控制反转

以前我们写代码的时候,如果 A 类需要用到 B 类,我们就在 A 类里面直接 new 一个 B 对象出来,这样 A 类就控制了 B 类对象的创建

有了 IoC 之后,这个控制权就“反转”了,不再由 A 类来控制 B 对象的创建,而是交给外部的容器来管理

IoC 降低了对象之间的耦合度,让每个对象只关注自己的业务实现,不关心其他对象是怎么创建的

@Service
public class UserServiceImpl implements UserService {
  @Autowired
  private UserDao userDao;
  
  // 不需要主动创建 UserDao,由 Spring 容器注入
  public BaseUserInfoDTO getAndUpdateUserIpInfoBySessionId(String session, String clientIp) {
    // 直接使用注入的 userDao
    return userDao.getBySessionId(session);
  }
}

codejavaspring八股大约 6 分钟
Spring系列八股8 - IOC2

IOC

BeanFactory和ApplicantContext的区别

控制反转就是把创建和管理 bean 的过程转移给了第三方。而这个第三方,就是 Spring IoC Container,对于 IoC 来说,最重要的就是容器。

通俗点讲,因为项目中每次创建对象是很麻烦的,所以我们使用 Spring IoC 容器来管理这些对象,需要的时候你就直接用,不用管它是怎么来的、什么时候要销毁,只管用就好了。

容器是 IoC 最重要的部分,那么 Spring 如何设计容器的


codejavaspring八股大约 4 分钟
Spring系列八股9 - AOP1 (简介 + 概念)

AOP

AOP,也就是面向切面编程,简单点说,AOP 就是把一些业务逻辑中的相同代码抽取到一个独立的模块中,让业务逻辑更加清爽

alt text

从技术实现上来说,AOP 主要是通过动态代理来实现的

  • 如果目标类实现了接口,就用 JDK 动态代理
  • 如果没有实现接口,就用 CGLIB 来创建子类代理

代理对象会在方法执行前后插入我们定义的切面逻辑。

alt text

codejavaspring八股大约 4 分钟
Spring系列八股1 - Spring 简介 + 常用注解

Spring基础

什么是 Spring

Spring 是一个 Java 后端开发框架,其最核心的作用是帮我们管理 Java 对象

其最重要的特性就是 IoC,也就是控制反转。以前我们要使用一个对象时,都要自己先 new 出来。但有了 Spring 之后,我们只需要告诉 Spring 我们需要什么对象,它就会自动帮我们创建好并注入到 Spring 容器当中

另外,Spring 还提供了 AOP,也就是面向切面编程,在我们需要做一些通用功能的时候特别有用,比如说日志记录、权限校验、事务管理这些,我们不用在每个方法里都写重复的代码,直接用 AOP 就能统一处理


codejavaspring八股大约 6 分钟
Spring系列八股2 - Bean1

Spring基础

Bean

Bean 本质上就是由 Spring 容器管理的 Java 对象,但它和普通的 Java 对象有很大区别

普通的 Java 对象我们是通过 new 关键字创建的

而 Bean 是交给 Spring 容器来管理的,从创建到销毁都由容器负责。

从实际使用的角度来说,我们项目里的 Service、Dao、Controller 这些都是 Bean

比如 UserService 被标注了 @Service 注解,它就成了一个 Bean,Spring 会自动创建它的实例,管理它的依赖关系,当其他地方需要用到 UserService 的时候,Spring 就会把这个实例注入进去


codejavaspring八股大约 4 分钟
Spring系列八股3 - Bean2 (作用域 + 线程安全问题)

Spring基础

Bean的作用域

单例模式 (默认)

Bean 的作用域决定了 Bean 实例的生命周期和创建策略,singleton 是默认的作用域

整个 Spring 容器中只会有一个 Bean 实例。不管在多少个地方注入这个 Bean,拿到的都是同一个对象

@Component  // 默认就是singleton
public class UserService {
  // 整个应用中只有一个UserService实例
}

codejavaspring八股大约 5 分钟
Spring系列八股4 - Bean3 (Autowired注解 + 自动装配)

Spring基础

Autowired注解

原理

@Autowired 是 Spring 实现依赖注入的核心注解,其实现原理基于反射机制和 BeanPostProcessor 接口

整个过程分为两个主要阶段

第一个阶段是依赖收集阶段,发生在 Bean 实例化之后、属性赋值之前

AutowiredProcessor 会扫描 Bean 的所有字段、方法和构造方法,找出标注了 @Autowired 注解的地方,然后把这些信息封装成 Injection 元数据对象缓存起来


codejavaspring八股大约 4 分钟