孙哥Spring源码第16集

news2024/11/19 15:26:15

第16集 refresh()-prepareBeanFactory分析

【视频来源于:B站up主孙帅suns Spring源码视频】

1、设置类加载器

image-20230511153044987

2、设置SpringEL表达式 解析器

image-20230511153050121

3、设置内置的属性编辑器 (类型转换器)

image-20230511153052423

3.1、如何实现类型转化?

1、Converter

2、PropertyEditor

3.2、环境变量设置的技巧

环境变量设置classPath,如果不讲究就直接以当前目录作为类路径,实际上Java大量的java工具都在rt.jar,这样检索起来效率更高。

3.3、PropertyEditor类型转换器的实践

image-20230511163836834
  • 1、继承PropertyEditorSupport
  • 2、如何获得日期?
  • 3、谁调用谁传参
  • 4、拿到文本进行设置值,成功转换。
  • 5、怎么把转换好的数据交给Customer的birthday属性?
    • 5.1、super.setValue(d)
    • image-20230511151055493
  • 6、告诉Spring
    • image-20230511151508017

3.4、为什么通过super.setValue就可以将值交给Spring呢?表达的真正含义是什么呢?

存到了PropertyEditorSupport的value属性,getValue就可以取

image-20230511150956153

3.5、Java世界接口实现类的几种命名方式

1、UserDao->UserDaoImpl

2、IUserDao->UserDao

3、ApplicationContext,ClassPathXmlApplicationContext

4、FactoryBean,SqlSessionFatoryBean

5、PropertyEditor、PropertyEditorSupport

6、Action、ActionSupport

3.6、字符串为什么能给Class属性注入呢?

image-20230511152137447 image-20230511152125024

Spring内置的属性转换器
Stirng-》Class
String-》IO
String-》Integer

3.7、Converter实践

Spring的Converter主要用于将一个类型的对象转化为另一个类型的对象,常见的应用场景是在Web应用中进行属性绑定。

Converter提供了两个方法,分别是convertcanConvert。其中convert方法用于执行转化操作,接收两个参数,一个是原始对象(即需要转化的对象),另一个是目标类,表示需要将原始对象转化为目标类的实例。canConvert方法则是用于检查是否支持某个类型的转化,其接收一个源类型和目标类型,返回true或false。

下面是一个使用Converter的示例代码:

public class MyConverter implements Converter<String, MyObject> {

    @Override
    public MyObject convert(String source) {
        // 将字符串source转化为MyObject对象
        MyObject myObject = new MyObject();
        myObject.setXXX(source.getXXX());
        // ...
        return myObject;
    }

    @Override
    public boolean canConvert(Class<?> sourceType, Class<?> targetType) {
        // 检查是否支持将sourceType转化为targetType
        if (sourceType == String.class && targetType == MyObject.class) {
            return true;
        }
        return false;
    }

}

在上面的示例中,我们定义了一个名为MyConverter的Converter,在其中实现了convert和canConvert方法。canConvert方法检查源类型是否为String类型,目标类型是否为MyObject类型。如果是,则说明支持将String类型的数据转化为MyObject类型的数据;否则不支持。

下面是如何在Spring中注册和使用这个Converter:

@Configuration
public class MyConverterConfig {

    @Bean
    public ConversionService conversionService() {
        DefaultConversionService conversionService = new DefaultConversionService();
        conversionService.addConverter(new MyConverter());
        return conversionService;
    }

}

@RestController
public class MyController {

    @Autowired
    private ConversionService conversionService;

    @PostMapping("/my-url")
    public void myMethod(@RequestParam("param") MyObject param) {
        // 处理传入的MyObject对象
    }

4、通过BeanPostProcessor处理Aware

  • 创建一个ApplicationContextAwareProcessor
    对如下Ware进行添加这个对象
  • EvnriromentAware、ApplicationContextAware… 时机 不在工厂启动的时候操作,而是创建对象的第三步初始化中通过BeanPostProcessor完成
  • 不要在工厂启动的时候 注入这些Aware 而是在对象创建的时候在注入,default-autowired = byName byType 都不会产生任何的问题,但是 construstor,如果不放入BeanPostProcessor处理的话,对象实现Aware接口都是以set的形式注入,那么就会失效。
image-20230511165233809

5、进行接口类型与 实现对象的配对

image-20230511165933585

6、内部事件监听处理

image-20230511170043423

7、处理资源系统参数

image-20230511170744143
  • Environment 可以替换信息${name}->替换成配置文件信息
    • .property ----> ${name}
  • SystemProperty —> 获得系统参数等信息
    • OS
    • 位数…

8、prepareBeanFactory总结

image-20230511164440071

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

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

相关文章

Ubuntu 20.04 Server配置网络

0&#xff0c;环境 服务器&#xff1a; Intel(R) Xeon(R) Gold 6248R CPU 3.00GHz 96核 网卡&#xff1a; 多网卡 1&#xff0c; 镜像下载 http://old-releases.ubuntu.com/releases/ubuntu-20.04.1-desktop-amd64.iso 2&#xff0c; 系统安装--具体步骤就不贴出来&#…

Navicat 强大的数据模型功能 | 面向数据库设计、架构和数据资产梳理等使用场景

数据模型是用来描述数据、组织数据和对数据进行操作的一组概念和定义。根据不同的应用需求&#xff0c;数据模型可以分为概念模型、逻辑模型和物理模型。这些数据模型帮助数据库设计人员设计和管理数据库&#xff0c;以满足用户的需求。 Navicat 强大的数据模型功能主要适用于…

Linux c++开发-03-使用CMake组织工程

一、简单文件的编译 有如下的目录结构&#xff1a; 其中 helloworld.cpp如下&#xff1a; #include <iostream> using namespace std; int main() {printf("hello world my name is Ty!");return 0; }CMakeLists.txt如下&#xff1a; cmake_minimum_requir…

cocos creator配置终端调试

在launch.json里添加"preLaunchTask":“CocosCreator compile” 在cocos creator里选择开发者&#xff0c;visual studio code工作流&#xff0c;选择添加编译任务。 添加 settings.json {"files.exclude":{"**/.git": true,"**/.DS_Sto…

数据结构与算法(三)线性表

线性表定义 线性表&#xff08;List&#xff09;&#xff1a;零个或多个数据元素的有限序列。 首先它是一个序列&#xff0c;其次&#xff0c;线性表强调是有限的。 前驱元素&#xff1a;若A元素在B元素的前面&#xff0c;则称A为B的前驱元素 后继元素&#xff1a;若B元素在…

【代码随想录day23】不同路径

题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&#xff1f; 示…

明茨伯格的人际关系角色理论

明茨伯格的人际关系角色理论是由社会心理学家明茨伯格&#xff08;William Schutz&#xff09;在20世纪50年代提出的一种关于人际关系的理论。该理论主要探讨了人际关系中的三个角色&#xff1a;包容性、控制性和亲密性。这些角色代表了人们在互动中所表现出的行为和需求。下面…

ClickHouse进阶(六):副本与分片-2-Distributed引擎

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术,IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 &#x1f4cc;订阅…

Qt各个版本下载及安装教程(离线和非离线安装)

Qt各个版本下载链接&#xff1a; Index of /archive/qthttps://download.qt.io/archive/qt/ 离线安装 &#xff0c;离线安装很无脑&#xff0c;下一步下一步就可以。 我离线下载 半个小时把2G的exe下载下来了

使用boost::geometry::union_ 合并边界(内、外)- 方案一

使用boost::geometry::union_ 合并边界&#xff08;内、外&#xff09;&#xff1a;方案一 结合 boost::geometry::read_wkt() 函数 #include <iostream> #include <vector>#include <boost/geometry.hpp> #include <boost/geometry/geometries/point_x…

linux C编程 获取系统时间

1.clock_gettime #include<time.h> int clock_gettime(clockid_t clk_id,struct timespec *tp); struct timespec {time_t tv_sec; /* 秒*/long tv_nsec; /* 纳秒*/ }clk_id : CLOCK_BOOTTIME&#xff0c;以系统启动时间为时间原点的时间体系&#xff0c;不受其它因素的…

PowerQuery动态加载M公式

Power Query 是Excel中的强大数据处理与转换工具&#xff0c;如果需要“动态”处理数据&#xff0c;大家第一时间想到的是可以使用VBA&#xff0c;利用代码创建M公式&#xff0c;进而创建PQ查询&#xff0c;但是复杂的M公式可能有很多行&#xff0c; 使用VBA处理起来并不是很方…

只考一门数据结构!安徽工程大学计算机考研

安徽工程大学 考研难度&#xff08;☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分析&#xff09;、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文992字&#xff0c;预计阅读&#xff1a;3分钟 2023考情概况 安徽工程大…

程序员自由创业周记#8:怎么设计

软件的样子 就像建造房子&#xff0c;工人施工需要照着图纸&#xff0c;没有图纸直接上手施工倒是也可以&#xff0c;只是房子的质量和样子都不敢恭维。程序员在一定意义上与建筑工人很像&#xff0c;只不过他们码砖&#xff0c;我们码码。软件开发之前也需要提前设计好界面&a…

本地开机启动jar

1&#xff1a;首先有个可运行的jar包 本地以ruiyi代码为例打包 2&#xff1a;编写bat命令---命名为.bat即可 echo off java -jar D:\everyDay\test\RuoYi\target\RuoYi.jar 3&#xff1a;设置为开机自启动启动 快捷键winr----输入shell:startup---打开启动文档夹 把bat文件复…

交换空间和虚拟内存的区别

分析&回答 交换空间和虚拟内存的区别在于使用的系统不一样,产生的技术手段不一样 交换空间 Linux 中的交换空间&#xff08;Swap space&#xff09;在物理内存&#xff08;RAM&#xff09;被充满时被使用。如果系统需要更多的内存资源&#xff0c;而物理内存已经充满&am…

UG\NX CAM二次开发 插入工序 UF_OPER_create

文章作者:代工 来源网站:NX CAM二次开发专栏 简介: UG\NX CAM二次开发 插入工序 UF_OPER_create 效果: 代码: void MyClass::do_it() {tag_t setup_tag=NULL_TAG;UF_SETUP_ask_setup(&setup_tag);if (setup_tag==NULL_TAG){uc1601("请先初始化加工环境…

linux操作系统中环境变量详解

目录 1.环境变量的基本概念 2.查看环境变量 3.PATH 4.root和普通用户的HOME 5.和环境变量相关的命令 6.环境变量的组织方式 6.1通过代码获取环境变量 6.2通过第三方变量environ获取 6.3通过系统调用获取环境变量 6.4通过系统调用设置环境变量 1.环境变量的基本概念 …

R语言图形绘制

&#xff08;1&#xff09;条形图 > barplot(c(1,2,4,2,6,4,3,5)) > barplot(c(1,2,4,2,6,4,3,5),horiz TRUE) #besideTRUE 表示将多个组别的图形并排显示&#xff0c;使它们在水平方向上对齐 #而当 besideFALSE&#xff08;默认值&#xff09;时&#xff0c;多个组别的…

达梦8 在CentOS 系统下静默安装

确认系统参数 [rootlocalhost ~]# ulimit -a core file size (blocks, -c) unlimited data seg size (kbytes, -d) unlimited【1048576(即 1GB)以上或 unlimited】 scheduling priority (-e) 0 file size (blocks, -f) unlimite…