跳至主要內容

EkkoSonya's Blog

好好学习,天天向上

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 分钟
Spring系列八股5 - 设计模式 + 三级依赖

Spring基础

设计模式

Spring 框架里面确实用了很多设计模式

工厂模式 (管理 Bean)、单例模式 (IOC)、代理模式 (AOP)

模版模式、观察者模式

涉及:

  • 工厂模式
    • BeanFactory 就是一个典型的工厂,它负责创建和管理所有的 Bean 对象
    • 我们平时用的 ApplicationContext 其实也是 BeanFactory 的一个实现
    • 当我们通过 @Autowired 获取一个 Bean 的时候,底层就是通过工厂模式来创建和获取对象的。
  • 单例模式
    • 单例模式也是 Spring 的默认行为。默认情况下,Spring 容器中的 Bean 都是单例的,整个应用中只会有一个实例
    • 这样可以节省内存,提高性能。当然我们也可以通过 @Scope 注解来改变 Bean 的作用域,比如设置为 prototype 就是每次获取都创建新实例。
  • 代理模式
    • 代理模式在 AOP 中用得特别多。Spring AOP 的底层实现就是基于动态代理的,对于实现了接口的类用 JDK 动态代理,没有实现接口的类用 CGLIB 代理。比如我们用 @Transactional 注解的时候,Spring 会为我们的类创建一个代理对象,在方法执行前后添加事务处理逻辑。
  • 模版模式
    • 模板方法模式在 Spring 里也很常见,比如 JdbcTemplate。它定义了数据库操作的基本流程:获取连接、执行 SQL、处理结果、关闭连接,但是具体的 SQL 语句和结果处理逻辑由我们来实现。
  • 观察者模式
    • 观察者模式在 Spring 的事件机制中有所体现。我们可以通过 ApplicationEvent 和 ApplicationListener 来实现事件的发布和监听。比如用户注册成功后,我们可以发布一个用户注册事件,然后有多个监听器来处理后续的业务逻辑,比如发送邮件、记录日志等。
  • 适配器模式
  • 策略模式

codejavajspring八股大约 13 分钟
Spring系列八股6 - Spring 启动分析

Spring基础

最简单的 Spring 模版

package com.ekko;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Configuration;

@Configuration
public class Main {
    public static void main(String[] args) {
      // 这就是启动 Spring 容器最核心、最简单的一行代码
      AnnotationConfigApplicationContext context =
              new AnnotationConfigApplicationContext(Main.class);

      System.out.println("Spring 容器启动完成!");
    }
}

codejavaspring八股大约 10 分钟
JVM 八股14 - IDEA 运行流程

IDEA 点击运行后的流程

.java 文件  --javac-->  .class 文件  --java-->  执行
(源代码)    (编译)      (字节码)      (运行)     (程序)

java 是用来运行 .class 文件的,所以在用 java 之前,需要先用 javac 编译。


codejavajvm八股大约 3 分钟
JVM 八股15 - javac 和 java 命令

编译与运行

.java 文件  --javac-->  .class 文件  --java-->  执行
(源代码)    (编译)      (字节码)      (运行)     (程序)
  • javac:编译器,将 .java 源文件编译成 .class 字节码
  • java:运行器,启动 JVM 加载并执行 .class 文件

codejavajvm八股大约 3 分钟
JVM 八股16 - 类加载器分析

jdk jre | jar

┌─────────────────────────────────────────┐
│              JDK                         │
│  ┌────────────────────────────────────┐ │
│  │              JRE                    │ │
│  │  ┌────────────────────────────────┐│ │
│  │  │            JVM                 ││ │
│  │  │  (Java Virtual Machine)        ││ │
│  │  │   - 加载 .class                ││ │
│  │  │   - 执行字节码                 ││ │
│  │  └────────────────────────────────┘│ │
│  │   + 核心类库 (rt.jar)              │ │
│  │   - java.lang.*                    │ │
│  │   - java.util.*                    │ │
│  └────────────────────────────────────┘ │
│   + 开发工具                             │
│   - javac (编译器)                      │
│   - java (运行器)                       │
│   - javadoc (文档生成)                  │
│   - jdb (调试器)                        │
│   - jmap, jstack (性能分析)             │
└─────────────────────────────────────────┘

codejavajvm八股大约 4 分钟
JVM 八股17 - JVM 调优

JVM 调优

性能检测工具

  • 系统层面 (可以监控系统整体的资源使用情况,比如说内存、CPU、IO 使用情况、网络使用情况)
    • top
    • iostat
    • netstat
    • vmstat
  • JDK 自带的命令行工具层面
    • jps
    • jstat
    • jinfo
    • jmap
    • jhat
    • jstack
    • jcmd
    • 可以查看 JVM 运行时信息、内存使用情况、堆栈信息等

codejavajvm八股大约 5 分钟