⿊马程序员Spring视频教程,全⾯深度讲解spring5底层原理学习笔记介绍
注:
1. 每⼀讲对应⼀个⼆级标题,每⼀个三级标题是使⽤⼦项⽬名称命名的,和我代码仓库的项⽬是⼀⼀对应的;
2. 代码⾥⾯⽤到了lombok插件来简化了Bean中的get()、set()⽅法,以及⽇志的记录的时候⽤了lombok的@Slf4j注解。
笔记中如有不正确的地⽅,欢迎在评论区指正,⾮常感谢
每个⼦项⽬对应的视频链接以及⼀些重要内容的笔记
第⼀讲BeanFactory与ApplicationContext的区别与联系
spring_01_beanfactory_applicationcontext_differences_connections
测试代码:
@SpringBootApplication
@Slf4j
public class A01Application {
public static void main(String[] args){
ConfigurableApplicationContext context = SpringApplication.run(A01Application.class, args);
// class org.springframework.boot.t.AnnotationConfigServletWebServerApplicationContext
System.out.Class());
}
}
到底什么是BeanFactory
它是ApplicationContext的⽗接⼝
⿏标选中ConfigurableApplicationContext,按Ctrl + Shift + U或者Ctrl + Alt + U打开类图,可以看到ApplicationContext的有个⽗接⼝是BeanFactory
它才是 Spring 的核⼼容器,主要的 ApplicationContext 实现都 [组合]了他的功能
打印Class(),可以看到具体的实现类是
ConfigurableApplicationContext context = SpringApplication.run(A01Application.class, args);
// org.springframework.boot.t.AnnotationConfigServletWebServerApplicationContext
System.out.Class());
按图索骥,AnnotationConfigServletWebServerApplicationContext⼜继承了ServletWebServerApplicationContext,在这个类⾥⾯可以到beanFactory作为成员变量出现。
BeanFactory接⼝中的⽅法
查看springboot默认的ConfigurableApplicationContext类中的BeanFactory的实际类型
ConfigurableApplicationContext context = SpringApplication.run(A01Application.class, args);
// org.springframework.boot.t.AnnotationConfigServletWebServerApplicationConte
xt
ConfigurableListableBeanFactory beanFactory = BeanFactory();
// 查看实际类型
// class org.springframework.beans.factory.support.DefaultListableBeanFactory
System.out.Class());
从打印结果可以了解到实际类型为DefaultListableBeanFactory,所以这⾥以BeanFactory的⼀个实现类DefaultListableBeanFactory作为出发点,进⾏分析。
它的类图如下:
这⾥我们暂且不细看DefaultListableBeanFactory,先看DefaultListableBeanFactory的⽗类DefaultSingletonBeanFactory,先选中它,然后
按F12,可以跳转到对应的源码,可以看到有个私有的成员变量singletonObjects
这⾥通过反射的⽅法来获取该成员变量,进⾏分析
先补充⼀下反射获取某个类的成员变量的步骤:
获取成员变量,步骤如下:
1. 获取Class对象
2. 获取构造⽅法
3. 通过构造⽅法,创建对象
4. 获取指定的成员变量(私有成员变量,通过setAccessible(boolean flag)⽅法暴⼒访问)
5. 通过⽅法,给指定对象的指定成员变量赋值或者获取值
public void set(Object obj, Object value)
在指定对象obj中,将此 Field 对象表⽰的成员变量设置为指定的新值
public Object get(Object obj)
resource和autowired注解的区别返回指定对象obj中,此 Field 对象表⽰的成员变量的值
代码如下:
Field singletonObjects = DeclaredField("singletonObjects");
/
/ 设置私有变量可以被访问
singletonObjects.setAccessible(true);
ConfigurableListableBeanFactory beanFactory = BeanFactory();
Map<String, Object> map =(Map<String, Object>) (beanFactory);
// 查看实际类型
// class org.springframework.beans.factory.support.DefaultListableBeanFactory
System.out.Class());
这⾥(beanFactory)为什么要传⼀个ConfigurableListableBeanFactory的变量进去呢?打印了这个beanFactory的实际类型
为DefaultListableBeanFactory,查看其类图,可以了解到该类也实现了DefaultSingletonBeanRegistry
接⼝,所以这⾥反射获取某个类的成员变量的get()⽅法中可以作为参数传进来。
ApplicationContext ⽐ BeanFactory 多点啥?
多实现了四个接⼝:
MessageSource: 国际化功能,⽀持多种语⾔
ResourcePatternResolver: 通配符匹配资源路径
EnvironmentCapable: 环境信息,系统环境变量,*.properties、*.l等配置⽂件中的值ApplicationEventPublisher: 发布事件对象

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。