Spring底层核心原理

news/2024/4/23 19:18:51/

文章目录

  • Spring底层核心原理
    • Bean的生命周期
    • 推断构造方法
    • AOP原理
    • Spring事务

Spring底层核心原理

下面这几行代码是一个Spring的入门代码,第一行是通过java配置类 注解的方式创建一个Spring容器,第二行是通过XML配置文件的方式创建一个Spring容器

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
//ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
UserService userService = (UserService) context.getBean("userService");
userService.test();

最后两行代码就是从Spring容器中拿一个Bean对象并执行方法。那么Spring是如何创建一个Bean对象的嘞?



Bean的生命周期

  • 推断构造方法,并执行得到普通对象

  • 依赖注入

  • aware回调

  • 初始化前

    执行BeanPostProcessor接口中的postProcessBeforeInitialization()方法

  • 初始化

    • 执行有@PostConstruct注解的方法
    • 执行InitializingBean接口中的afterPropertiesSet()方法
    • 执行XML配置文件中init-method属性指定的方法
  • 初始化后

    执行BeanPostProcessor接口中的postProcessAfterInitialization()方法

  • 普通对象/代理对象 存入容器中

  • 使用

  • 销毁

    • 执行DisposableBean接口的destroy()方法
    • @PreDestroy注解的方法
    • XML 配置文件中destroy-method属性指定的方法


推断构造方法

如果没有写构造方法,那么Spring会执行默认空参的构造方法

如果显示写了一个构造方法,那么Spring就会使用这个构造方法,构造方法中如果有参数那么会进行依赖注入

如果显示写了多个构造方法并有空参的构造方法时,会执行空参的构造方法

如果显示写了多个构造方法没有空参的构造方法时,运行时会报错。解决方法是在要执行的构造方法上加@Autowired注解



AOP原理

cjlib和jdk两种动态代理的实现都是有一个target属性来存储普通对象,代理对象中重写要执行的方法,首先执行增强逻辑,然后通过target属性去执行目标方法。伪代码如下:

public class UserServiceProxy extends UserService{private UserService target;public void test(){// TODO 增强业务target.test();// TODO 增强业务}
}


那么如何判断一个Bean是否需要进行AOP创建一个普通对象嘞?

  • 遍历所有有@Aspect注解的切面Bean
  • 遍历所有的方法
  • 判断方法上的切点表达式是否和当前正在创建的Bean匹配
  • 如果匹配则把这个切面中增强方法存入一个Map缓存中

真正要执行代理对象的方法时会从缓存中取出相应的增强逻辑来执行,再去执行目标方法。



Spring事务

Spring中如果要使用事务需要配置一个JdbcTemplate和一个事务管理器,它们俩都需要配置DataSource。

@ComponentScan("com.hs")
@Configuration
public class AppConfig {@Beanpublic JdbcTemplate jdbcTemplate() {return new JdbcTemplate(dataSource());}@Beanpublic PlatformTransactionManager transactionManager() {DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();transactionManager.setDataSource(dataSource());return transactionManager;}@Beanpublic DataSource dataSource() {DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/hs?characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai");dataSource.setUsername("root");dataSource.setPassword("123456");return dataSource;}
}


Spring事务大致执行流程如下:

  • 判断要执行的方法上是否存在@Transcational注解
  • 如果存在则通过事务管理器创建一个connection连接对象
  • autoCommit设置为false
  • 去执行目标方法target.method()
  • 如果出现了异常则回滚rollback(),没有异常则提交commit()



如果上面的配置类中不加@Configuration注解,那么Spring的事务会失效。原因如下:

JdbcTemplate和事务管理器都需要DataSource,都会调用dataSource()获取。如果不加@Configuration注解,那么他们俩获取的DataSource就不是同一个。

代理对象中操作的是事务管理器的连接对象,而业务方法却是使用的JdbcTemplate,所以就导致了Spring事务失效。

而如果加上了@Configuration注解,在调用dataSource()时会先去Spring容器中找DataSource,如果没找到才回去调用方法创建一个。


http://www.ppmy.cn/news/47893.html

相关文章

EMC 专用名词大全~电压变化与闪烁

8.1 电压变化 voltage change 在一定但非规定的时间间隔内电压均方很值或峰值在两个相邻电平问的持续变动。 8.2 相对电压变化 relative voltage change 电压变化的幅值与额定电压值之比。 8.3 电压变化持续时间 duration of a voltage change 电压由初值增大或减小至终值所经历…

使用AIDEGen进行AOSP开发

什么是AIDEGen AIDEGen,大概是“Android IDE (helper) Generator”的简写,是 AOSP 源代码树中的一个工具,它允许从 Android Studio 等通常仅为非平台应用程序开发配置的 IDE 中处理系统应用程序。 AIDEGen 旨在自动化项目设置过程&#xff…

SpringBoot 介绍

1.简介 SpringBoot最开始基于Spring4.0设计,是由Pivotal公司提供的框架。 SpringBoot发展史: 2003年Rod Johnson成立Interface公司,产品是SpringFramework2004年,Spring框架开源,公司改名为Spring Source2008年&…

数据库复习资料abc

1、数据库设计过程一般包括哪些内容? 答:需求分析、概念设计、逻辑设计、物理设计、应用开发(系统实施)、系统维护。 2、数据库系统的特点? 答:数据结构化、数据共享性高,数据独立性强&#x…

CMMI管理流程—配置管理计划

1. 人员及职责 提示: (1)根据《项目计划》中的角色分配,确定配置管理员,CCB(配置控制委员会)成员。 (2)CCB的人数根据项目规模而定。一般地,项目经理是CCB…

全注解下的SpringIoc

Spring架构中的核心理念就是IOC和AOP,可以说,Spring的强大离不开这两大特性。 因为spring boot推荐采用注解开发,所以文中主要介绍基于注解的Spring Ioc。 IoC容器简介 Spring IoC 容器是个管理 Bean(在Spring 中把每个需要管理…

Nacos 客户端的服务发现与服务订阅机制的纠缠 - 篇七

Nacos 客户端的服务发现与服务订阅机制的纠缠 - 篇七 历史篇章 🕐Nacos 客户端服务注册源码分析-篇一 🕑Nacos 客户端服务注册源码分析-篇二 🕒Nacos 客户端服务注册源码分析-篇三 🕓Nacos 服务端服务注册源码分析-篇四 &am…

7.1 大学排行榜分析(project)

大学排名没有绝对的公正与权威,文件(alumni.txt, soft.txt)中为按照不同评价体系给出的国内大学前100名排行,对比两个排行榜单前m的学校的上榜情况,分析不同排行榜排名的差异。 输入输出 第一行输入1,第二行输入m&…

双塔模型:微软DSSM模型浅析

1.背景 DSSM是Deep Structured Semantic Model (深层结构语义模型) 的缩写,即我们通常说的基于深度网络的语义模型,其核心思想是将query和doc映射到到共同维度的语义空间中,通过最大化query和doc语义向量之间的余弦相似度,从而训…

【C++学习】类和对象--封装

具有相同性质的对象,我们可以抽象称为类(如:人类,车类 封装 封装是C面向对象三大特性之一 1.将属性和行为作为一个整体,表现生活中的事物 2.将属性和行为加以权限控制 一.表现事物,属性和行为写在一起 …

类加载器详解(重点)之双亲委派

回顾一下类加载过程 开始介绍类加载器和双亲委派模型之前,简单回顾一下类加载过程。 类加载过程:加载->连接->初始化。连接过程又可分为三步:验证->准备->解析。 加载是类加载过程的第一步,主要完成下面 3 件事情…

关于API的测试(电商Taobao/jdAPI测试)

我们在API上执行的一些常见测试如下。 验证返回值是否基于输入条件。应根据请求验证API的响应。 在API更新任何数据结构时验证系统是否正在验证结果 验证API是触发其他事件还是请求其他API 在没有返回值的情况下验证API的行为 API测试的优势(测试KEY申请)&#xff…

【DRF开发手册】使用 Django Rest Framework 的 @action 定义自定义方法

本文节选自笔者博客: https://www.blog.zeeland.cn/archives/so3f209hfeac 💖 作者简介:大家好,我是Zeeland,全栈领域优质创作者。📝 CSDN主页:Zeeland🔥📣 我的博客&…

Linux基础——DNS服务器原理及搭建

Linux基础——DNS服务器原理及搭建 一、DNS服务器原理1.DNS系统分布式数据结构2.DNS查询类型3.DNS服物器类型 二、搭建DNS域名解析服务器步骤1.安装bind软件包2. 查看需要修改的配置文件所在路径3. 修改主配置文件4. 修改区域配置文件,添加正向区域配置5.配置正向区…

算法套路十一 ——回溯法之组合型回溯

算法套路十一 ——回溯法之组合型回溯 该节是在上一节回溯法之子集型回溯的基础上进行描写,组合型回溯会在子集型回溯的基础上判断所选子集是否符合组合要求, 故请首先阅读上一节算法套路十——回溯法之子集型回溯 算法示例:LeetCode77. 组合…

C# 异常处理机制和常见的异常类型

在 C# 中,异常处理是一个非常重要的概念,它可以让我们在程序发生错误时进行有效的处理,使程序具备更好的鲁棒性。C# 异常处理机制基于 try-catch-finally 语句块,其基本用法如下: try {// 可能会抛出异常的代码 } cat…

ai改写句子软件-ai改写

AI免费伪原创:助力网站内容升级 您是否曾经为网站优化而烦恼,无论是内容更新还是SEO优化,都需要大量的时间和精力。但是,您是否知道,现在有一款能够使用AI技术来帮助您完成这些任务,而且还是免费的呢&…

【图像处理】基于 Matlab GUI 阈值分类器进行草莓识别步骤流程

目录 基于 Matlab GUI 阈值分类器进行草莓识别 基于 Matlab GUI 阈值分类器进行草莓识别 基于 Matlab GUI 阈值分类器进行草莓识别,可以通过以下步骤实现: 1.采集草莓图像数据集,包括正负样本 2.使用 MA

ES6入门

ECMAScript 6 简介 ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。 ECMAScri…

Unity RenderStreaming 云渲染3.1.0-exp.6 食用手册

Unity云渲染 🥗资源🍤兼容性🍧手机端连接🥩安装方法🍛IP端口设置🍱官方案例尝鲜🌲导入案例🌲添加场景🌲启动WebApp🌲打开Menu场景🌲连接参数设置&…