Spring-依赖来源

依赖来源

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.mzph.cn/diannao/9145.shtml

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

相关文章

爬虫跟代理ip有什么不同

爬虫与代理IP的区别主要体现在它们的定义、功能和使用场景上。以下是对这两者的详细比较&#xff1a; 定义 爬虫&#xff1a; 爬虫是一种自动抓取互联网信息的脚本或者程序。它可以按照一定的规则&#xff0c;自动化地浏览网络中的信息&#xff0c;并将这些信息抓取下来&#x…

深入解析C#中的接口设计原则

深入解析C#中的接口设计原则 目录 深入解析C#中的接口设计原则 一、接口设计的SOLID原则 二、接口设计的最佳实践 三、接口设计的高级技术 四、结论 接口在面向对象编程中扮演着至关重要的角色。它们是定义行为契约的一种方式&#xff0c;允许实现者提供这些行为的具体实现…

扩展学习|结合故事的力量和数字的力量:混合方法研究和混合研究综述

文献来源&#xff1a;Pluye, Pierre, and Quan Nha Hong. "Combining the power of stories and the power of numbers: mixed methods research and mixed studies reviews." Annual review of public health 35 (2014): 29-45. 文献获取&#xff1a;链接&#xff1…

最靠谱线上线下相亲交友婚恋脱单渠道指南大全,单身必看!

刚好在30岁的年纪把自己嫁出去啦。以下这些都是我经历过的相亲途径&#xff0c;分享出来&#xff0c;希望能帮到大家 一.线上小程序/App 1.单身狗解救平台&#xff08;高质量人多&#xff0c;工作学历实名认证&#xff0c;你可能看到眼花&#xff0c;自己得有自己辨别力&#x…

<sa8650> snapdragon-auto-hqx-4-5-6-0基线代码camera开发错误记录

<sa8650> snapdragon-auto-hqx-4-5-6-0基线代码camera开发错误记录 一、 qcxserver自启动关不掉二、 qcxserver启动后串行器(MAX96717)detect不到?三、 qcarcam_test运行后系统log提示QCarCamReserve错误四、 tuning错误导致的异常DumpCore本文主要记录CAMERA开发过程中的一…

[ 项目 ] tcmalloc简化版—高并发内存池

目录 前言 基本介绍 高并发 内存池 定长内存池 基本介绍 框架设计 具体实现 性能测试 整体框架介绍 申请内存过程 threadcache 1.基本介绍 2.具体实现 centralcache 1.基本介绍 2.具体实现 pagecache 1.基本介绍 2.具体实现 申请内存连通 释放内存过…

探索智能编程新境界:我与Baidu Comate的独特体验之旅

文章目录 一、认识Baidu Comate二、VS Code安装Baidu Comate教程三、Baidu Comate功能体验功能概览具体功能1.根据注释自动生成代码2.函数注释3.行间注释4.代码解释5.生成单元测试6.代码优化7.答疑解惑 四、交互体验五、总结 一、认识Baidu Comate ✨Baidu Comate插件是一款基…

QT---day4事件

1、思维导图 2、 头文件 #ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> #include<QIcon> //图标类 #include<QLabel> //标签类 #include<QMovie> //动图类 #include<QLineEdit> //行编辑器类 #include<QPushButton> //按钮…

阿里云开发uniapp之uni-starter

一、为什么使用uni-starter uni-starter是集成商用项目常见功能的、云端一体应用快速开发项目模版。 一个应用有很多通用的功能&#xff0c;比如登录注册、个人中心、设置、权限管理、拦截器、banner... uni-starter将这些功能都已经集成好&#xff0c;另外&#xff0c;uni-s…

QLabel文本

1. 文本自动换行 label->setWordWrap(true); 2. 文本居中显示 要将QLabel中的文本居中显示&#xff0c;可以使用setAlignment()方法来设置文本的对齐方式为居中。以下是一个示例代码&#xff1a; #include <QApplication> #include <QLabel>int main(int arg…

MySQL慢查询优化【三】

当面对MySQL中的慢查询时&#xff0c;可以根据不同的情况采取相应的优化方案。以下是几种常见的慢SQL情况及其对应的优化方案&#xff1a; 缺少索引的情况&#xff1a; SELECT * FROM orders WHERE customer_id 1000;如果orders表中的customer_id列没有索引&#xff0c;这个…

C:STDIN_FILENO和stdin的区别

1.STDIN_FILENO定义于文件/usr/include/unistd.h #define STDIN_FILENO 0 /* Standard input. */ #define STDOUT_FILENO 1 /* Standard output. */ #define STDERR_FILENO 2 /* Standard error output. */ 作为read&#xff0c;write&#…

【算法训练 day23 二叉搜索树的最小绝对差、二叉搜索树的众数、二叉树的最近公共祖先】

目录 一、二叉搜索树的最小绝对差-LeetCode 530思路实现代码递归处理使用数组 个人问题 二、二叉搜索树的众数-LeetCode 501思路实现代码map统计计数递归过程中计数 个人问题 三.二叉树的最近公共祖先-LeeCode 236思路实现代码个人问题总结 一、二叉搜索树的最小绝对差-LeetCod…

【退役之重学Java】如何处理消息丢失问题

即如何保证消息的可靠性传输 一、场景 网络丢包&#xff0c;导致丢失消息RabbitMQ 没来得及保存消息&#xff0c;就挂掉了消费者接受到消息&#xff0c;但没处理完&#xff0c;消费者挂掉了 二、怎么办 生产者 将 channel 设置为 confirm 模式&#xff0c;是异步模式&#x…

Linux-笔记 Makefile简单入门

1、Makefile Makefile是一种文本文件&#xff0c;通常用于定义项目的编译规则和依赖关系。它通常与GNU Make工具一起使用&#xff0c;用于自动化软件项目的构建过程。Makefile中包含了一系列规则&#xff0c;每个规则定义了如何生成一个或多个目标文件以及生成这些目标文件所需…

Baidu Comate智能编码助手

Baidu Comate智能编码助手 &#x1f388;1.Baidu Comate的简介&#x1f388;2.安装Baidu Comate&#x1f388;3.Baidu Comate实现功能&#x1f388;4.使用注释进行智能代码提示&#x1f388;5.结束语 &#x1f388;1.Baidu Comate的简介 根据官网的介绍&#xff0c;我们了解到B…

作为一名软件开发,您是否认同“如果代码有效,就不要修复它”这一理论?

请大家关注我的公众号&#xff0c;“老胡聊Java” 这句话非常有道理&#xff0c;因为这句话不仅包含了技术&#xff0c;而且还包含了人情世故。 1 一个项目的代码动辄几千几万行&#xff0c;而且分布的位置也不同&#xff0c;比如有java代码python代码&#xff0c;甚至还可能有…

力扣每日一题113:路径总和||

题目 中等 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSu…

《深入理解kafka》对于实际问题的理解

Q1&#xff1a;消息可靠性(不重不漏) 1.1 如何保证消息不丢 1.2 如何保证消息不重 Q2&#xff1a;积压/消费能力 2.1 线上积压排查思路 2.2 增加消费能力 Q1&#xff1a;消息可靠性(不重不漏) 理解可靠性前。介绍消息语义&#xff0c;即消息传递的标准 标准 丢失 重复 适用…

Redis-3 数据持久化

一.什么是数据持久化&#xff1f; redis是把数据存储在内存中的&#xff0c;而采用DRAM芯片存储的内存会面临断电导致数据丢失的问题&#xff0c;因此我们可以将redis在内存中的数据存储一份到磁盘中&#xff0c;用于内存数据丢失时的恢复&#xff0c;这个过程就叫做数据持久化…