Java面试题

Spring Boot启动流程详解

spring boot将日常企业应用研发中的各种场景都抽取出来,做成一个个的starter(启动器)并遵循"约定大于配置"原则,简化了传统Spring应用的初始化过程。

1准备环境

2创建上下文

3启动业务逻辑

main 方法

一.new SpringApplication()

1.应用类型推断

启动时通过检测类路径中是否存在javax.servlet.Servlet相关类,自动判断是Web应用还是普通应用。Web应用会初始化嵌入式Servlet容器(如Tomcat)。

2.初始化器和监听器设置

从META-INF/spring.factories文件加载并实例化配置的初始化器和监听器类。这是Spring Boot自动配置机制的核心,实现了组件的自动发现和注册。

3.设置主类

二.调用run方法

1.环境准备阶段

加载所有配置源包括:

  • 默认配置文件(application.properties/yml)
  • 系统环境变量
  • JVM系统属性
  • 命令行参数
    构建完整的应用环境配置。
2.上下文创建

组件扫描和Bean装配

通过@ComponentScan扫描指定包下的组件。

配合@Configuration类完成Bean定义注册。

自动配置类通过@EnableAutoConfiguration触发。

3.上下文刷新

完成所有Bean的实例化、依赖注入和初始化:

  1. 所有bean初始化完成
  2. 事件监听器注册完毕
  3. web项目启动内嵌的Tomcat
4.启动后处理

执行所有ApplicationRunner和CommandLineRunner触发事件通知实现类

5.最终发布ApplicationReadyEvent表示应用完全启动。

控制反转(IoC)

核心概念

控制:对象的创建的控制权限;

反转:将对象的控制权限交给spring。

之前我们创建对象时用new,现在直接从spring容器中取,维护对象之间的依赖关系,降低对象之间的耦合度。

实现方式为DI,依赖注入,有三种注入方式:构造器、setter、字段注入

依赖注入方式
java 复制代码
// 构造器注入
@Service
public class ServiceA {
    private final ServiceB serviceB;
    
    @Autowired
    public ServiceA(ServiceB serviceB) {
        this.serviceB = serviceB;
    }
}

// Setter注入
@Service
public class ServiceC {
    private ServiceD serviceD;

    @Autowired
    public void setServiceD(ServiceD serviceD) {
        this.serviceD = serviceD;
    }
}

// 字段注入(实际属于反射注入)
@Service
public class ServiceE {
    @Autowired
    private ServiceF serviceF;
}

AOP面向切面编程

它是一种编程思想,通过 动态代理 和 字节码增强 技术,实现不修改源代码的情况下给程序动态添加功能的一种技术,可以降低代码的耦合度,便于管理,提高代码的可重用性。

AOP的实现方式有两种:

JDK动态代理:目标类实现了接口,代理类实现与目标类相同的接口。

CGLIB动态代理:目标类未实现接口,生成目标类的子类作为代理类。

AOP应用场景

1.权限控制

在方法执行前校验用户权限。

2.性能监控

统计方法执行时间,识别性能瓶颈。

3.缓存优化

在方法调用前检查缓存,避免重复查询数据库。

4.日志记录

在方法执行前后记录参数、耗时等信息。

5.事务管理

通过@Transactional注解实现事务的自动开启和提交。

@Autowired和@Resource注解的区别

@Autowired是Spring提供的按类型注入的注解,若存在多个同类型Bean需配合@Qualifier指定名称。@Resource是Java标准注解,默认按名称匹配,名称未匹配时按类型注入。前者依赖Spring框架,后者更通用且支持名称/类型双策略。

相关推荐
学长毕设8 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
zzu123zsw9 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
源码集结号10 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
论文复现现场11 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
啃瓜子的松鼠11 小时前
泛微OAe9-后端二开异步调用
java
秋天的怀念_David12 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
外收内放12 小时前
Python基础语法练习题(73)
java·前端·python
Wang's Blog12 小时前
Java 项目实战: 交友项目 - 环信后台发送消息测试
java·交友
用户37215742613512 小时前
Java 操作 Word 脚注和尾注:添加、读取与删除
java
小嘉丶学长13 小时前
Day14 · 字典与集合
java·开发语言·网络·python·学习·1024程序员节