Spring底层核心概念

news/2024/4/26 12:06:32/文章来源:https://blog.csdn.net/qq_35529931/article/details/127618077

在深入Spring核心源码之前,需要了解一些Spring的核心概念,便于后面的进行展开。

一:BeanDefinition

表示Bean定义,BeanDefinition中存在很多属性用来描述一个Bean的特点;

  • class,表示Bean的类型
  • scope,表示Bean作用域,单列或者原型等
  • lazyInit,表示Bean是否懒加载
  • initMethodName,表示Bean初始化时要执行的方法
  • destroyMethodName,表示Bean销毁时要执行的方法

在Spring中,我们通常经过如下方式定义Bean(声明式):

  • @Bean
  • @Component
    通过编程式也可以直接定义Bean
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);// 生成一个BeanDefinition对象,并设置beanClass为User.class,并注册到ApplicationContext中
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
beanDefinition.setBeanClass(User.class);
context.registerBeanDefinition("user", beanDefinition);System.out.println(context.getBean("user"));```**2.BeanDefinitionReader**
Spring源码中所提供的BeanDefinition读取器,相当于Spring源码的基础设施。```java
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);AnnotatedBeanDefinitionReader annotatedBeanDefinitionReader = new AnnotatedBeanDefinitionReader(context);// 将User.class解析为BeanDefinition
annotatedBeanDefinitionReader.register(User.class);System.out.println(context.getBean("user"));

3.ClassPathBeanDefinitionScanner
是扫描器,进行扫描包路径,对扫描到的类进行解析。

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.refresh();ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(context);
scanner.scan("com.zhouyu");System.out.println(context.getBean("userService"));

4.BeanFactory
表示Bean的工厂,负责Bean的创建。
ApplicationContext是BeanFactory的一种

public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,MessageSource, ApplicationEventPublisher, ResourcePatternResolver {...
}

在这里插入图片描述

二:BeanPostProcessor

表示Bean的后置处理器,我们可以定义一个或者多个BeanPostProcessor。

@Component
public class ZhouyuBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if ("userService".equals(beanName)) {System.out.println("初始化前");}return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if ("userService".equals(beanName)) {System.out.println("初始化后");}return bean;}
}

一个BeanPostProcessor可以再任意一个Bean的初始化之前以及初始化之后去做用户自定义的逻辑

2.BeanFactoryPostProcessor
表示Bean工厂的后置处理器,干涉BeanFactory的创建过程

3.FactoryBean

@Component
public class ZhouyuFactoryBean implements FactoryBean {@Overridepublic Object getObject() throws Exception {UserService userService = new UserService();return userService;}@Overridepublic Class<?> getObjectType() {return UserService.class;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

快速排序【模板+边界处理】

全文目录&#xff1a;&#x1f603;快速排序的思想&#x1f615; 快速排序演示图&#x1f634; 代码模板❗️ i 和 j 的取值和循环处理 ❗️&#x1f5fd; i 和 j 的取值 &#x1f5fd;&#x1f5fd; 循环条件判断 &#x1f5fd;&#x1f4a2; 边界问题 &#x1f4a2;&#x1f…

Scala数组常用函数(2)

函数&#xff08;1&#xff09;&#xff1a;Scala数组常用函数&#xff08;1&#xff09;_后季暖的博客-CSDN博客 目录 四十六.-def isTraversableAgain: Boolean 四十七.-def iterator: collection.Iterator[T] 四十八.-def last: T 四十九.-def lastIndexOf(elem: T):…

计算机毕业设计(66)php小程序毕设作品之视频点播学习在线教育小程序系统

基于微信小程序的毕业设计题目&#xff08;12&#xff09;php在线教育视频点播学习小程序(含开题报告、任务书、中期报告、答辩PPT、论文模板) 项目背景和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于微信小程序视频点播系统&#xff0c;前台用户使用小程序&a…

【2022秋招面经】——数据库

参考链接&#xff1a; 1. 20个数据库常见面试题讲解 2. MySQL数据库面试题&#xff08;2020最新版&#xff09; 小林coding-MySQL 小林coding-Redis 文章目录数据库关系型数据库和非关系型数据库数据库高并发环境解决方案数据库外键的优缺点百万级别或以上的数据如何删除如何保…

计算机毕业设计(64)php小程序毕设作品之校园运动场地预约小程序系统

项目背景和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于微信小程序运动场地预约系统&#xff0c;前台用户使用小程序&#xff0c;后台管理使用基PHPMySql的B/S架构&#xff1b;通过后台添加开放的场地类型&#xff08;比如羽毛球、篮球、网球等&#xff09;、…

混合与面剔除帧缓冲

混合混合不同物体的多种颜色为一种颜色,所以透明度能让我们看穿物体,透明度一般由alpha颜色值来决定的,透明度为1-alpha值。首先试着使用有一部分透明的草贴图.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);//用来说明现在…

JavaScript 52 JavaScript this 关键词

JavaScript 文章目录JavaScript52 JavaScript this 关键词52.1 this 是什么&#xff1f;52.2 方法中的 this52.3 单独的 this52.4 函数中的 this&#xff08;默认&#xff09;52.5 函数中的 this&#xff08;严格模式&#xff09;52.6 事件处理程序中的 this52.7 对象方法绑定5…

2022年马丁·加德纳聚会数学魔术分享之《加加减减的奥秘》回顾

早点关注我&#xff0c;精彩不错过&#xff01;2022.10.30&#xff0c;本年度的线上马丁加德纳聚会如约举行。随着大家对线上这种活动方式的适应和不变的对趣味数学的热爱&#xff0c;今年聚会的规模&#xff0c;无论是线下还是线上&#xff0c;都朝着欣欣向荣的方向发展着。详…

【CV】第 7 章:使用 YOLO 进行对象检测

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

【历史上的今天】11 月 1 日:蒂姆·库克诞生;Amazon.com 注册域名;比特币问世

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2022 年 11 月 1 日&#xff0c;在 1949 年的今天&#xff0c;中国科学院在北京成立&#xff0c;它是中国最高学术领导机构的综合研究中心&#xff0c;首任院长是郭沫若…

【C++】继承- 赋值兼容转换、虚基表

前言 Hi~大家好呀&#xff01;欢迎来到我的C系列学习笔记&#xff01; 我上一篇的C笔记链接在这里哦~&#xff1a;【C】模板的非类型参数、特化、分离编译_柒海啦的博客-CSDN博客 C类与对象博客在这里哦~&#xff1a;【C】类和对象_柒海啦的博客-CSDN博客_c类和对象 本篇&#…

【异步系列五】关于async、await、promise、微任务、宏任务的执行顺序解析【最终篇】

前段时间总结了几篇关于异步原理、Promise原理、Promise面试题、async/await 原理的文章&#xff0c;链接如下&#xff0c;感兴趣的可以去看下&#xff0c;相信会有所收获。 一篇文章理清JavaScript中的异步操作原理 Promise原理及执行顺序详解 10道 Promise 面试题彻底理解…

输入输出、文件读写、数据类型

package chapter01 /* object:关键字&#xff0c;声明一个单例对象&#xff08;伴生对象&#xff09;*/ object HelloWorld {/*main方法&#xff1a;从外部可以直接调用执行的方法def 方法名称&#xff08;参数名称&#xff1a;参数数据类型&#xff09;:方法返回值类型 { 方法…

2.8 标准输入与格式化输出

文章目录1. Input 标准输入1.1 标准输入1.2 阻塞状态1.3 输入提示1.4 获取输入字符串1.5 输入版本差异1. Python3 输入数据类型2. Python2 输入数据类型2. Print 格式化输出2.1 输入2.2 sep 参数2.3 end 参数2.4 快捷写法2.5 格式化输出1. 语法格式2. 字典形式传值3. 元组形式传…

什么是GPT

什么是GPT 参考资料&#xff1a; https://zhuanlan.zhihu.com/p/350017443 https://zhuanlan.zhihu.com/p/106462515 https://www.cnblogs.com/yifanrensheng/p/13167796.html https://blog.csdn.net/weixin_45577864/article/details/119651372 Generative Pre-trained T…

这可能是你需要的vue考点梳理

对 React 和 Vue 的理解&#xff0c;它们的异同 相似之处&#xff1a; 都将注意力集中保持在核心库&#xff0c;而将其他功能如路由和全局状态管理交给相关的库&#xff1b;都有自己的构建工具&#xff0c;能让你得到一个根据最佳实践设置的项目模板&#xff1b;都使用了Virt…

Golang学习之路3-基础认识(下)

文章目录前言一、数组1.定长数组2.不定长数组二、map1.使用关键字 map 来声明2.使用 make 来声明3.添加元素4.检索key的value是否存在5.删除元素6.遍历map7.map的注意点在这里插入图片描述三、指针1.使用指针& 及 *2.空指针四、循环与条件判断1.循环2.条件判断前言 学习一…

Go语言函数

什么是函数 func main() {fmt.Println("hello,world")//调用函数fmt.Println(add(1, 2)) }// func 函数名&#xff08;参数&#xff0c;参数。。。&#xff09;&#xff0c;函数调用返回值类型&#xff08;&#xff09; func add(a, b int) int {c : a breturn c }函…

Ray tracing 光线追踪 之 embree ,从入门到精通 02 从源码编译与安装

1. 下载预编译的ispc&#xff0c;安装 网址&#xff1a; https://ispc.github.io resources -> github page 进入ispc 的github的release页&#xff1a;Releases ispc/ispc GitHub 找到一个预编译好了的ispc&#xff0c;其中在windows平台上是&#xff1a;https://github…

Redis缓存穿透、击穿、雪崩介绍

面试高频&#xff0c;工作常用 缓存穿透&#xff08;查不到&#xff09; 概念 用户想要查询一个数据&#xff0c;发现redis内存数据库没有&#xff0c;也就是缓存没有命中&#xff0c;于是向持久层数据库查询。发现也没有&#xff0c;于是本次查询失败&#xff0c;当用户很多的…