Spring-依赖来源

news/2024/5/20 17:29:12

依赖来源

1 Spring BeanDefinition(xml,注解,BeanDefinitionBuilder, 还有API实现的单例对象)
2 Spring 内建BeanDefinition
在这里插入图片描述
3 内建单例对象
在这里插入图片描述

依赖注入和依赖查找的区别

Context.refresh() 的时候会调用这个方法:prepareBeanFactory(beanFactory)注入下面这几个对象:
在这里插入图片描述
我们可以看到在依赖查找的时候用到了:

在这里插入图片描述

public class DependencySourceDemo {//  字段注入注入postProcessProperties 方法执行 早于setter注入 也早于 @PostConstruct@AutowiredBeanFactory beanFactory;@AutowiredResourceLoader resourceLoader;@AutowiredApplicationContext applicationContext;@AutowiredApplicationEventPublisher publisher;@PostConstructpublic void init() {System.out.println(beanFactory == applicationContext);System.out.println(beanFactory == applicationContext.getAutowireCapableBeanFactory());System.out.println(resourceLoader == applicationContext);System.out.println(publisher == applicationContext);}@PostConstructpublic void initLookUp() {getBean(BeanFactory.class);getBean(ApplicationEventPublisher.class);getBean(ApplicationContext.class);getBean(ResourceLoader.class);}public <T> T getBean(Class<T> type) {try {beanFactory.getBean(type);} catch (NoSuchBeanDefinitionException e) {System.err.println("无法在当前容器总找到" + type + "类型的bean");}return null;}public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();context.register(DependencySourceDemo.class);context.refresh();}
}

运行结果:
在这里插入图片描述
所以说依赖注入会比依赖查找多这样几个对象。

依赖来源及依赖使用场景

比较这几种来源的使用场景:
单体对象也就是内建的单例对象
在这里插入图片描述
1 Spirng BeanDefinition 通过 DefaultListableBeanFactory#registerBeanDefinition进行注册
这个方法后面会有这样一段代码,前者是存储了beanName和beanDefinition 后者是为了保证顺序,因为后者是一个ArrayList
在这里插入图片描述
2 单体对象
由SingletonBeanRegistry#registerSingleton
限制是没有生命周期管理的,也无法实现延迟初始化。
在这里插入图片描述
为什么ConcurrentHashMap还有加锁呢?
因为我们查找了以后如果没有还需要往里面放,所以也存在线程安全问题。
我们看到这里还有一把锁,是因为这个方法可能会被单独使用,但是其实这里锁的是同一个对象,如果是同一个线程内没有额外加锁。

在这里插入图片描述
同样这里也使用了LinkedHashSet保证了有序:
在这里插入图片描述

非容器托管的对象

DefaultListableBeanFactory#registerResolvableDependency
限制:
没有生命周期
无法实现延迟初始化
无法通过依赖查找

public class ResolvableDependencySourceDemo {
@Autowired
String value;
public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();context.register(ResolvableDependencySourceDemo.class);context.addBeanFactoryPostProcessor(beanFactory -> {beanFactory.registerResolvableDependency(String.class, "demo");});context.refresh();ResolvableDependencySourceDemo bean = context.getBean(ResolvableDependencySourceDemo.class);System.out.println(bean.value);
}
}

这里为什么要这样写呢?通过回调函数,因为我们依赖注入的时候如果容器启没有refresh beanFactory.registerResolvableDependency(String.class, “demo”);这个时候注册会报错,如果启动了,我们可不可以把这个注册写到refresh之后呢?不可以因为这个时候上面的@Autowired 注入的时候找不到这个bean也会报错,所以通过回调函数的方式来处理,当Factory创建好以后进行注册。

外部化配置作为依赖

没有生命周期
无法实现延迟初始化
无法通过依赖查找

@Configuration
@PropertySource(value = "meta-info/demo.properties", encoding = "GBK")
public class ExtDependencyDemo {@Value("${usr.name}")private String name;@Value("${usr.pass}")private String pass;public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();context.register(ExtDependencyDemo.class);context.refresh();ExtDependencyDemo bean = context.getBean(ExtDependencyDemo.class);System.out.println(bean.pass);System.out.println(bean.name);}
}

参考资料:小马哥核心编程思想


http://www.mrgr.cn/p/30308840

相关文章

微服务---gateway网关

目录 gateway作用 gateway使用 添加依赖 配置yml文件 自定义过滤器 nacos上的gateway的配置文件 我们现在知道了通过nacos注册服务&#xff0c;通过feign实现服务间接口的调用&#xff0c;那对于不同权限的用户访问同一个接口&#xff0c;我们怎么知道他是否具有访问的权…

FileLink文件摆渡技术解析:如何实现数据的安全摆渡与隔离

文件摆渡系统&#xff0c;这一现代科技名词&#xff0c;蕴含着深刻的科技内涵和广泛的应用前景。简而言之&#xff0c;文件摆渡系统是一种高效、安全的文件传输工具&#xff0c;它能够在不同的网络环境之间实现文件的快速、稳定传输。在今天的数字化时代&#xff0c;随着数据量…

Linux(openEuler、CentOS8)企业内网DHCP服务器搭建(固定Mac获取指定IP)

----本实验环境为openEuler系统<以server方式安装>&#xff08;CentOS8基本一致&#xff0c;可参考本文&#xff09;---- 目录 一、知识点二、实验&#xff08;一&#xff09;为服务器配置网卡和IP&#xff08;二&#xff09;为服务器安装DHCP服务软件&#xff08;三&a…

【JAVA】类加载过程,以及类加载器

类加载过程&#xff0c;以及类加载器 一、类加载的过程二、类加载器介绍三、跨类加载三、举例说明 一、类加载的过程 类加载是Java虚拟机&#xff08;JVM&#xff09;将类文件加载到内存中并转换成对应的类对象的过程。它确保了类文件能够正确加载并转换成可执行的类对象&…

【半个月我拿下了软考证】软件设计师高频考点--系统化教学-网络安全

&#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;软件设计师考点暴击 ⭐&#x1f170;️进入狂砍分⭐ ⭐软件设计师高频考点文档&#xff0c; ⭐软件设计师高频考点专栏 ⭐软件设计师高频考点⭐ &#x1f3b6;&#xff08;A) 考点1&#xff0c;网络攻击 理解记忆 &#…

初学python记录:力扣1652. 拆炸弹

题目&#xff1a; 你有一个炸弹需要拆除&#xff0c;时间紧迫&#xff01;你的情报员会给你一个长度为 n 的 循环 数组 code 以及一个密钥 k 。 为了获得正确的密码&#xff0c;你需要替换掉每一个数字。所有数字会 同时 被替换。 如果 k > 0 &#xff0c;将第 i 个数字用…

【数据库原理及应用】期末复习汇总高校期末真题试卷06

试卷 一、选择题 1&#xff0e; ________是长期存储在计算机内的有组织,可共享的数据集合. A.数据库管理系统 B.数据库系统 C.数据库 D.文件组织 1&#xff0e; 有12个实体类型&#xff0c;并且它们之间存在15个不同的二元联系&#xff0c;其中4个是1:1联系类型&#xff0c;5…

pgsql查看指定模式的存储过程

pgsql查看指定模式的存储过程 在 PostgreSQL 中&#xff0c;如果你想要查看指定模式的存储过程&#xff08;也称为函数&#xff09;&#xff0c;你可以使用 \df 或 \df 命令在 psql 命令行工具中&#xff0c;或者使用 SQL 查询来从 pg_catalog 系统模式中查询。 \df命令行查询…

基于Python的LSTM网络实现单特征预测回归任务(TensorFlow)

单特征&#xff1a;数据集中只包含2列&#xff0c;时间列价格列&#xff0c;仅利用价格来预测价格 目录 一、数据集 二、任务目标 三、代码实现 1、从本地路径中读取数据文件 2、数据归一化 3、创建配置类&#xff0c;将LSTM的各个超参数声明为变量&#xff0c;便于后续…

如何让加快OpenHarmony编译速度?

OpenHarmony 有两种编译方式&#xff0c;一种是通过 hb 工具编译&#xff0c;一种是通过 build.sh 脚本编译。本文笔者将提升 build.sh 方式编译速度的方法整理如下&#xff1a; 因为笔者只用 build.sh 脚本编译&#xff0c;没用过 hb 工具&#xff0c;好像下面的选项也可以用于…

容灾演练双月报|郑大一附院数据级容灾演练切换

了解更多灾备行业动态 守护数字化时代业务连续 目录 CONTENTS 01 灾备法规政策 02 热点安全事件 03 容灾演练典型案例 01 灾备法规政策 3月19日&#xff0c;工信部发布《工业和信息化部办公厅关于做好2024年信息通信业安全生产和网络运行安全工作的通知》。明确提出“…

llama.cpp制作GGUF文件及使用

llama.cpp的介绍 llama.cpp是一个开源项目&#xff0c;由Georgi Gerganov开发&#xff0c;旨在提供一个高性能的推理工具&#xff0c;专为在各种硬件平台上运行大型语言模型&#xff08;LLMs&#xff09;而设计。这个项目的重点在于优化推理过程中的性能问题&#xff0c;特别是…

我们的小程序每天早上都白屏,真相是。。。

大家好&#xff0c;我是程序员鱼皮。最近我们在内测一款面试刷题小程序&#xff0c;没错&#xff0c;就是之前倒下的 “面试鸭”&#xff01; 在我们的内测交流群中&#xff0c;每天早上都会有同学反馈&#xff1a;打开小程序空白&#xff0c;没任何内容且登录不上。 然后过了…

开源离线AI笔记应用

前言 Reor 是一款人工智能驱动的桌面笔记应用程序&#xff0c;它能自动链接相关笔记、回答笔记中的问题并提供语义搜索。所有内容都存储在本地&#xff0c;支持 Windows、Linux 和 MacOS。Reor 站在 Ollama、Transformers.js 和 LanceDB 等巨头的肩膀上&#xff0c;使 LLM 和嵌…

iceoryx源码阅读(二)——共享内存管理

目录1 共享内存模型2 获取共享内存2.1 MemoryManager::getChunk2.2 MemPool::getChunk3 释放共享内存3.1 SharedChunk::freeChunk3.2 MemPool::freeChunk4 总结 基于共享内存通信的核心在于共享内存的管理,包括共享内存的分配、释放。 1 共享内存模型 iceoryx先将整块共享内存…

iceoryx源码阅读(一)——全局概览

一、什么是iceoryx iceoryx是一套基于共享内存实现的进程间通信组件。 二、源码结构 iceoryx源码包括若干工程,整理如下表所示:下图展示了主要项目之间的依赖(FROM:iceoryx(冰羚)-Architecture):三、iceoryx应用程序结构 iceoryx应用程序有三类进程,分别为Publisher、Su…

Linux字符设备驱动(一) - 框架

字符设备是Linux三大设备之一(另外两种是块设备&#xff0c;网络设备)&#xff0c;字符设备就是字节流形式通讯的I/O设备,绝大部分设备都是字符设备&#xff0c;常见的字符设备包括鼠标、键盘、显示器、串口等等&#xff0c;当我们执行ls -l /dev的时候&#xff0c;就能看到大量…

1.4 初探JdbcTemplate操作

实战目的 掌握Spring框架中JdbcTemplate的使用&#xff0c;实现对数据库的基本操作。理解数据库连接池的工作原理及其在实际开发中的重要性。通过实际操作&#xff0c;加深对Spring框架中ORM&#xff08;对象关系映射&#xff09;的理解。 关键技术点 JdbcTemplate操作&…

重发布和路由策略

重发布 在同一个网络拓扑结构中&#xff0c;如果存在多种不同的路由协议&#xff0c;由于不同路由协议的机理各有不同&#xff0c;对路由的处理也不相同&#xff0c;这就在网络中造成了路由信息的隔离&#xff0c;在路由协议的边界设备上&#xff0c;将某种路由协议的路由信息引…

Java中的线程

一、创建线程的几种方式&#xff1f; ① 通过继承Thread类并重写run方法 &#xff0c;实现简单但不可以继承其他类 Thread底层也是实现了Runnable接口&#xff0c;重写的是run而不是start方法 ②实现Runnable接口并重写run方法&#xff0c; 避免了单继承的局限性&#xff…