Spring底层核心原理解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: Spring底层核心原理解析

一、前言

在之前我们使用文字分析过Spring的几个核心原理(IOC, DI. AOP),本章会把Spring中的Bean生命周期进行较为详细的讲解

Spring相关文章汇总(Ps:有部分还未完成):

二、Bean的创建生命周期

  • 通过推断构造方法来实例化一个对象
  • 对该对象进行依赖注入(属性赋值)
  • 依赖注入后,Spring会判断该对象是否实现了BeanNameAware接口、BeanClassLoaderAware接口、BeanFactoryAware接口,如果实现了,就表示当前对象必须实现该接口中所定义的setBeanName()、setBeanClassLoader()、setBeanFactory()方法,那Spring就会调用这些方法并传入相应的参数(Aware回调
  • 初始化前(@PostConstruct)
  • 初始化(继承InitializingBean类)
  • 初始化后(AOP)
  • 获取到代理对象

三、Spring中是通过什么方式创建对象的

在java语言中肯定是通过某个类去创建对象的, 下面是实例代码

public static void main(String[] args) {
    // 创建一个Spring对象
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
    // 创建对象
    NingxuanService ningxuanService = (NingxuanService)context.getBean("ningxuanService");
    // 执行方法
    ningxuanService.test();
}
复制代码

一共分为三步走:

  • 解析Appconfig类, 获取扫描路径, 获取Bean对象
  • 扫描包下的所有类文件的注解, 如果发现 @Component, @Service, @Bean等注解的时候就会将这些注解给记录下来, 存到一个Map中
  • Spring会根据相应的规则生成对应的BeanName作为map的key, value是当前类

这个时候调用 context.getBean("BeanName")的时候就会获取到对应的实体类, 从而去创建对象

三、Bean生命周期详解

首先, 我们新建一个Config类, 设定好包扫描路径同时开启AOP

@ComponentScan("com.ningxuan")
@EnableAspectJAutoProxy
public class AppConfig {
    @Bean
    public NingxuanService ningxuanService(){
        return new NingxuanService();
    }
}
复制代码

推断构造方法

Spring在基于某个类生成Bean的时候, 会通过该类的构造方法去实例化一个对象, 但是如果这个类拥有多个构造方法的时候就会进入以下的判断

  • 只有一个构造方法, 那么不管这个构造犯法是有参的还是无参的都会使用这个构造方法
  • 如果存在多个构造方法
  • 在多个构造犯法中, 若存在无参构造方法, 则默认使用无参构造犯法
  • 若该有参构造方法上有使用 @Autowired注解, 则使用有参构造
  • 若多个构造方法皆为有参构造
  • 若构造方法上都没有加 @Autowired注解, 则报错
  • 若有某一个构造方法上加了 @Autowired注解, 则使用该构造方法
  • 若存在多个构造方法上交了 @Autowired注解, 则报错

Spring会根据入参的类型和名字去Spring中找Bean对象:

  • 先根据入参类型找, 若只找到一个, 那就直接用来作为入参
  • 如果根据类型找到多个, 则在根据入参名字来确定唯一的一个
  • 最终如果没有找到, 则报错

确定用哪个构造方法, 确定入参的Bean对象, 这个古城就叫做推断构造方法

依赖注入

通过推断构造方法得到一个对象后, Spring会判断该对象中是否存在被 @Autowired 注解了的属性, 把这些属性找出来并由Spring进行赋值

初始化前

被 @PostConstruct 注解标注的方法, 是为该bean初始化前执行的方法, 具体如下

@Component()
public class NingxuanService{
    // 初始化前执行
    @PostConstruct
    public void after(){
        System.out.println("初始化前");
    }
    public void test(){
        System.out.println("执行方法: 宁轩");
    }
}
复制代码

初始化

想要一个方法在被Spring创建对象初始化时执行, 则要将这个类继承 InitializingBean 类, 并实现 afterPropertiesSet 方法, 且要抛出异常, 具体如下

@Component()
public class NingxuanService implements InitializingBean {
    // 初始化前执行
    @PostConstruct
    public void after(){
        System.out.println("初始化前");
    }
    public void test(){
        System.out.println("执行方法: 宁轩");
    }
    // 初始化执行
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("初始化");
    }
}
复制代码

AOP

想要执行AOP, 老规矩, 在扫描类上使用注解 @EnableAspectJAutoProxy 进行标注, , 并且新建一个aop类, 使用 @Aspect和@Component 注解标注, 本次测试采用了 AOP 中的前置执行和后置执行, 具体如下:

@Aspect
@Component
public class TestAop {
    @After("execution(public void com.ningxuan.demo.service.NingxuanService.test())")
    public void TestAfter(JoinPoint joinPoint){
        System.out.println("方法执行后");
    }
    @Before("execution(public void com.ningxuan.demo.service.NingxuanService.test())")
    public void TestVefore(JoinPoint joinPoint){
        System.out.println("方法执行前");
    }
}
复制代码

执行测试

根据以上的代码, 我们执行 main 方法, 可以得到以下测试结果

网络异常,图片无法展示
|


目录
相关文章
|
5天前
|
安全 算法 网络协议
解析:HTTPS通过SSL/TLS证书加密的原理与逻辑
HTTPS通过SSL/TLS证书加密,结合对称与非对称加密及数字证书验证实现安全通信。首先,服务器发送含公钥的数字证书,客户端验证其合法性后生成随机数并用公钥加密发送给服务器,双方据此生成相同的对称密钥。后续通信使用对称加密确保高效性和安全性。同时,数字证书验证服务器身份,防止中间人攻击;哈希算法和数字签名确保数据完整性,防止篡改。整个流程保障了身份认证、数据加密和完整性保护。
|
3月前
|
存储 缓存 算法
HashMap深度解析:从原理到实战
HashMap,作为Java集合框架中的一个核心组件,以其高效的键值对存储和检索机制,在软件开发中扮演着举足轻重的角色。作为一名资深的AI工程师,深入理解HashMap的原理、历史、业务场景以及实战应用,对于提升数据处理和算法实现的效率至关重要。本文将通过手绘结构图、流程图,结合Java代码示例,全方位解析HashMap,帮助读者从理论到实践全面掌握这一关键技术。
117 14
|
4月前
|
运维 持续交付 云计算
深入解析云计算中的微服务架构:原理、优势与实践
深入解析云计算中的微服务架构:原理、优势与实践
153 3
|
20天前
|
机器学习/深度学习 算法 数据挖掘
解析静态代理IP改善游戏体验的原理
静态代理IP通过提高网络稳定性和降低延迟,优化游戏体验。具体表现在加快游戏网络速度、实时玩家数据分析、优化游戏设计、简化更新流程、维护网络稳定性、提高连接可靠性、支持地区特性及提升访问速度等方面,确保更流畅、高效的游戏体验。
65 22
解析静态代理IP改善游戏体验的原理
|
17天前
|
编解码 缓存 Prometheus
「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
本期内容为「ximagine」频道《显示器测试流程》的规范及标准,我们主要使用Calman、DisplayCAL、i1Profiler等软件及CA410、Spyder X、i1Pro 2等设备,是我们目前制作内容数据的重要来源,我们深知所做的仍是比较表面的活儿,和工程师、科研人员相比有着不小的差距,测试并不复杂,但是相当繁琐,收集整理测试无不花费大量时间精力,内容不完善或者有错误的地方,希望大佬指出我们好改进!
78 16
「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
|
8天前
|
Java 数据库 开发者
详细介绍SpringBoot启动流程及配置类解析原理
通过对 Spring Boot 启动流程及配置类解析原理的深入分析,我们可以看到 Spring Boot 在启动时的灵活性和可扩展性。理解这些机制不仅有助于开发者更好地使用 Spring Boot 进行应用开发,还能够在面对问题时,迅速定位和解决问题。希望本文能为您在 Spring Boot 开发过程中提供有效的指导和帮助。
46 12
|
6天前
|
开发框架 监控 JavaScript
解锁鸿蒙装饰器:应用、原理与优势全解析
ArkTS提供了多维度的状态管理机制。在UI开发框架中,与UI相关联的数据可以在组件内使用,也可以在不同组件层级间传递,比如父子组件之间、爷孙组件之间,还可以在应用全局范围内传递或跨设备传递。
24 2
|
2月前
|
机器学习/深度学习 自然语言处理 搜索推荐
自注意力机制全解析:从原理到计算细节,一文尽览!
自注意力机制(Self-Attention)最早可追溯至20世纪70年代的神经网络研究,但直到2017年Google Brain团队提出Transformer架构后才广泛应用于深度学习。它通过计算序列内部元素间的相关性,捕捉复杂依赖关系,并支持并行化训练,显著提升了处理长文本和序列数据的能力。相比传统的RNN、LSTM和GRU,自注意力机制在自然语言处理(NLP)、计算机视觉、语音识别及推荐系统等领域展现出卓越性能。其核心步骤包括生成查询(Q)、键(K)和值(V)向量,计算缩放点积注意力得分,应用Softmax归一化,以及加权求和生成输出。自注意力机制提高了模型的表达能力,带来了更精准的服务。
|
2月前
|
XML Java 开发者
Spring底层架构核心概念解析
理解 Spring 框架的核心概念对于开发和维护 Spring 应用程序至关重要。IOC 和 AOP 是其两个关键特性,通过依赖注入和面向切面编程实现了高效的模块化和松耦合设计。Spring 容器管理着 Beans 的生命周期和配置,而核心模块为各种应用场景提供了丰富的功能支持。通过全面掌握这些核心概念,开发者可以更加高效地利用 Spring 框架开发企业级应用。
84 18
|
22天前
|
传感器 监控 安全
智慧工地云平台的技术架构解析:微服务+Spring Cloud如何支撑海量数据?
慧工地解决方案依托AI、物联网和BIM技术,实现对施工现场的全方位、立体化管理。通过规范施工、减少安全隐患、节省人力、降低运营成本,提升工地管理的安全性、效率和精益度。该方案适用于大型建筑、基础设施、房地产开发等场景,具备微服务架构、大数据与AI分析、物联网设备联网、多端协同等创新点,推动建筑行业向数字化、智能化转型。未来将融合5G、区块链等技术,助力智慧城市建设。

推荐镜像

更多