spring源码核心

news2024/11/25 6:37:24

spring创建bean的生命周期(大概)

容器

可以理解容器为一个Map<beanName, bean对象>
在这里插入图片描述

通过类的构造方法创建对象

有两个有参构造方法,就坏了,spring不知道用哪个,这个时候可以加**@Autowired**
有无参和有参时,选无参
只有一个构造方法就用它
在这里插入图片描述
比如有两个有参构造:
在这里插入图片描述

比如如果只有一个有参构造,
在这里插入图片描述
此时传入的orderService有值吗?如果它是一个bean,就有值否则报错
先根据入参类型去找spring容器map<beanName, bean对象>里找如果找到一个直接用,但是可能找到多个对象,下面就有三个对象了
在这里插入图片描述
在这里插入图片描述
所以再通过入参名字去找唯一的一个

依赖注入

依赖注入原理伪代码:
在这里插入图片描述
注入的值还是从容器map里找
后续过程:
在这里插入图片描述

初始化前

如果想要在成为bean对象之前满足从数据库读信息到属性里(即属性赋值需要的数据库的值,可以加注解:
在这里插入图片描述
在这里插入图片描述
所以此时就是去找哪些方法加了postconstruct注解
在这里插入图片描述

初始化

初始化判断当前对象是否实现InitializingBean接口,重写afterPropertiesSet方法
在这里插入图片描述
如何判断?instance of InitializingBean
在这里插入图片描述

初始化后

处理对象方法里有aop的方法,并产生代理对象,代理对象成为bean
在这里插入图片描述

全部流程

在这里插入图片描述

AOP

增加切面AspectJ包,并在Config类上添加允许被切面的注解**@EnableAspectJAutoProxy**
在这里插入图片描述
在这里插入图片描述

AOP在初始化后阶段,利用CGLIB包生成代理对象。CGLIB是一个反射的包,和JDK的反射不同,cglib反射的对象可以不用实现接口,直接继承要被代理的类。
spring通过cglib的代理类创建代理对象,然后将原来的对象(拥有依赖注入的对象)赋给代理类里的target属性,代理对象调用的不再是父类对象的方法而是target对象的方法,同时执行切面方法。
所以绕了一圈除了多了切面,依赖注入的属性值和方法都是原来的那个对象
在这里插入图片描述

那如何确定该对象被切面了呢?

切面也是bean

  1. 首先在容器里找出所有的切面bean
  2. 遍历每一个切面bean
  3. 遍历其切面方法查看是否添加了通知注解@Before,@After…
  4. 通过方法的注解查看是否切点是哪个类的方法,缓存map
  5. 在代理对象的方法中织入切面,从4中的map缓存中取

spring 事务

在config配置类添加允许事务管理注解
在这里插入图片描述

加了注解**@Transactional**,抛出异常会回滚
在这里插入图片描述
事务也是基于AOP实现的,也是动态代理对象去执行,一般事务的AOP的order最小也就是优先级最低,应该先执行其他自定义的AOP切面

  1. 首先判断方法是否被transactional注解修饰
  2. 由事务管理器创建数据库连接conn
  3. 设置conn.autocommit = false
  4. 执行原方法
  5. 根据
    在这里插入图片描述

事务失效

propagation.never模式下,不允许有已经存在的事务,否则会抛出异常
首先调用userservice.test()时是代理对象调用test,开启事务,然后用target.test调用,因此数据库insert操作开始就是原来的普通对象target在执行,因此a方法是target调用,所以添加的事务没有用(必须是代理对象才有切面才能开启事务一系列的操作),此时事务失效,不会抛出异常。
在这里插入图片描述
怎么修改呢
可以实现自己注入自己。因为有transactional修饰,所以注入的是代理对象,此时a方法的调用也是代理对象,此时会抛出异常。
在这里插入图片描述

@Configuration

config类中如果不添加该注解,则事务管理器连接的数据库和JDBCTemplate连接的数据库是两个,所以事务失效。
在这里插入图片描述
添加了该注解,jdbc会拿到和事务管理器的同一个数据库,和代理模式有关:config类也是一个bean,利用的是他的代理对象,逻辑是连接数据库时会检查是否已经有了连接池DataSource bean,如果有直接返回,不用新建。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/874484.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

运营商二要素认证API接口:提供手机号实名验证服务,确保用户信息的真实性

随着互联网的快速发展&#xff0c;各行各业都需要用户进行实名认证。其中&#xff0c;涉及到用户个人信息的场景&#xff0c;如电商、游戏、直播、金融等需要用户实名认证的场景&#xff0c;必须要进行实名认证。然而&#xff0c;对于这些场景&#xff0c;用户的个人信息的真实…

04_14缺页异常,虚拟空间加深印象,匿名页,文件页

前言 写代码想知道某段时间内存够不够用 想更清楚高低水位 清楚虚拟ram和物理ram的关系 CPU通过地址总线可以访问连接在地址总线上的所有外设,包括物理内存、I0设备等等, 但从CPU发出的访问 地址并非是这些外设在地址总线上的物理地址&#xff0c; 而一个虚拟地址&#xff0c…

idea集成chatGPT,免费使用的bito神器

什么是Bito&#xff1f; Bito是一款在IntelliJ IDEA编辑器中的插件&#xff0c;Bito插件是由ChatGPT团队开发的&#xff0c;它是ChatGPT团队为了提高开发效率而开发的一款工具。ChatGPT团队是一支专注于自然语言处理技术的团队&#xff0c;他们开发了一款基于GPT的自然语言处理…

Springboot整合RabbitMq,详细使用步骤

Springboot整合RabbitMq&#xff0c;详细使用步骤 1 添加springboot-starter依赖2 添加连接配置3 在启动类上添加开启注解EnableRabbit4 创建RabbitMq的配置类&#xff0c;用于创建交换机&#xff0c;队列&#xff0c;绑定关系等基础信息。5 生产者推送消息6 消费者接收消息7 生…

优化堆排序(Java 实例代码)

目录 优化堆排序 Java 实例代码 src/runoob/heap/HeapSort.java 文件代码&#xff1a; 优化堆排序 上一节的堆排序&#xff0c;我们开辟了额外的空间进行构造堆和对堆进行排序。这一小节&#xff0c;我们进行优化&#xff0c;使用原地堆排序。 对于一个最大堆&#xff0c;首…

Azure概念介绍

云计算定义 云计算是一种使用网络进行存储和处理数据的计算方式。它通过将数据和应用程序存储在云端服务器上&#xff0c;使用户能够通过互联网访问和使用这些资源&#xff0c;而无需依赖于本地硬件和软件。 发展历史 云计算的概念最早可以追溯到20世纪60年代的时候&#x…

阿里云Alibaba Cloud Linux镜像系统介绍_常见问题解答FAQ

阿里云服务器操作系统Alibaba Cloud Linux镜像怎么样&#xff1f;可以代替CentOS吗&#xff1f;Alibaba Cloud Linux兼容性如何&#xff1f;有人维护吗&#xff1f;漏洞可以修复吗&#xff1f;Alibaba Cloud Linux完全兼容CentOS&#xff0c;并由阿里云官方免费提供长期维护。 …

数据统计与可视化的Dash应用程序

在数据分析和可视化领域&#xff0c;Dash是一个强大的工具&#xff0c;它结合了Python中的数据处理库&#xff08;如pandas&#xff09;和交互式可视化库&#xff08;如Plotly&#xff09;以及Web应用程序开发框架。本文将介绍如何使用Dash创建一个简单的数据统计和可视化应用程…

SpringBoot复习:(44)MyBatisAutoConfiguration

可以看到MyBatisAutoConfiguration引入了MyBatisProperties这个属性&#xff1a; MyBatisAutoConfiguration中配置了一个SqlSessionFactoryBean,代码如下&#xff1a; 可以配置mybatis-config.xml,需要配置文件里指定&#xff1a; mybatis.config-locationclasspath:/mybat…

ImportError: cannot import name ‘MutableMapping‘ from ‘collections‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【FreeRtos基础入门】任务状态

文章目录 前言一、任务状态1.阻塞状态(Blocked)2.暂停状态(Suspended)3.就绪状态(Ready) 总结 前言 本freertos使用stm32系列单片机&#xff0c;使用其他的也可以&#xff0c;如esp系列等… 任务管理是实时操作系统&#xff08;RTOS&#xff09;的核心功能之一&#xff0c;它…

VMware Workstation中安装了Windows7系统但是VMware Tools选项为灰色及无法安装的解决方法

一、问题描述 当我们在使用VMware Workstation安装好了Windows7系统后;该安装好的Windows7系统并不能自动适配WMware的界面,只能在中间显示很小的一部分内容;此时我们就需要给Windows7系统安装VMware Tools工具; 问题一:WMware中的【安装VMware Tools】选项则是灰色的无法…

最强自动化测试框架Playwright(21)-测试生成器inspector

测试生成器 运行该命令时&#xff0c;将打开两个窗口&#xff0c;一个浏览器窗口&#xff0c;可以在其中与要测试的网站进行交互&#xff0c;另一个是Playwright Inspector窗口&#xff0c;可以在其中记录测试&#xff0c;然后将其复制到编辑器中。 使用该命令运行测试生成器…

7.9 SpringBoot实战 拷贝工具类,扩展BeanUtils.copyProperties

文章目录 前言一、拷贝普通对象Bean1.1 基础的Bean拷贝1.2 支持忽略某些属性1.3 支持忽略字段值为null的属性1.4 通用的Bean拷贝1.4.1 拷贝时可指定忽略属性1.4.2 拷贝时外加忽略null属性 二、拷贝集合对象List2.1 拷贝时可指定忽略属性2.2 拷贝时外加忽略null属性 三、拷贝分页…

HOT92-最小路径和

leetcode原题链接&#xff1a;最小路径和 题目描述 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 示例 1&#xff1a; 输入&#xff1a;…

基础堆排序(Java 实例代码)

目录 基础堆排序 一、概念及其介绍 二、适用说明 三、过程图示 四、Java 实例代码 src/runoob/heap/Heapify.java 文件代码&#xff1a; 基础堆排序 一、概念及其介绍 堆排序&#xff08;Heapsort&#xff09;是指利用堆这种数据结构所设计的一种排序算法。 堆是一个近…

① vue复习。从安装到使用

vue官网&#xff1a;cn.vuejs.org vue安装 cnpm install -g vue/cli 查看是否安装成功 vue --version 创建一个项目 vue create vue-demo(项目名称) 这个取消掉。空格可选中或者取消。 运行项目&#xff1a; cd 进入到项目下 npm run serve 运行成功后&#xff0c;访问这…

面对算力瓶颈,如何利用CPU解决全链路智能编码?

编者按&#xff1a;英特尔是半导体行业和计算创新领域的全球领先厂商。与合作伙伴一起&#xff0c;英特尔推动了人工智能、5G、智能边缘等转折性技术的创新和应用突破&#xff0c;驱动智能互联世界。不久前&#xff0c;英特尔正式发布了第四代英特尔至强可扩展处理器&#xff0…

计算机网络-物理层(二)- 传输方式

计算机网络-物理层&#xff08;二&#xff09;- 传输方式 串型传输与并行传输 串行传输:是指数据是一个比特一个比特依次发送的&#xff0c;因此在发送端和接收端之间&#xff0c;只需要一条数据传输线路即可 并行传输:是指一次发送n个比特而不是一个比特&#xff0c;因此发送…

前端架构师的能力要求:打造可靠、灵活和可扩展的Web应用

随着互联网技术迅猛发展&#xff0c;现代Web应用程序变得越来越复杂且功能强大。作为一名前端架构师&#xff0c;在这个快节奏且竞争激烈的环境中&#xff0c;你需要具备广泛而深入地技术知识&#xff0c;并且有能力设计、开发和维护高度可靠、灵活和可扩展性强的Web应用。 深入…