生命周期
2025-03-06 20:59:25 0 举报
AI智能生成
生命周期
作者其他创作
大纲/内容
简单方式项目启动
this()
//把一些开天辟地需要的bean放进bdMap(并不会实例化,只有到了refresh才会实例化)
this.reader = new AnnotatedBeanDefinitionReader(this);
//这个类ClassPathBeanDefinitionScanner 里面有doScan()
//说白了就是1、New了一个扫描器 后面读文件用 2、让Spring认识@Component
this.scanner = new ClassPathBeanDefinitionScanner(this);
this.reader = new AnnotatedBeanDefinitionReader(this);
//这个类ClassPathBeanDefinitionScanner 里面有doScan()
//说白了就是1、New了一个扫描器 后面读文件用 2、让Spring认识@Component
this.scanner = new ClassPathBeanDefinitionScanner(this);
reader:
加载开天辟地的PostProcessors进入BeanDefineMap
1、依赖注入 使用的类 AutowiredAnnotationBeanPostProcessor,想用人家得先new一下吧;
2、扫描文件 使用的类ConfigurationClassPostProcessor,这个类来协调Scanner文件扫描和@Configuration注册;也就是ConfigurationClassPostProcessor先调用了Scanner文件扫描拿到类->包装成BeanDefine->放到Map,这一套逻辑代码写在哪,就是写在ConfigurationClassPostProcessor里面;
说白了就是你想用这两个能力,那得写代码吧,代码写在哪?就是这两个类里面
1、依赖注入 使用的类 AutowiredAnnotationBeanPostProcessor,想用人家得先new一下吧;
2、扫描文件 使用的类ConfigurationClassPostProcessor,这个类来协调Scanner文件扫描和@Configuration注册;也就是ConfigurationClassPostProcessor先调用了Scanner文件扫描拿到类->包装成BeanDefine->放到Map,这一套逻辑代码写在哪,就是写在ConfigurationClassPostProcessor里面;
说白了就是你想用这两个能力,那得写代码吧,代码写在哪?就是这两个类里面
先加载一些必须的postProcessor,比如解析配置类的,@autowire需要的类,也就是对应的PostProcessors
scanner:
就是在这把@Component加入到includeFilters中的,也就是让@Component生效
在@SpringbootApplication启动的时候,也可以通过@ConpomentScan设置includeFilters属性,让项目扫描一些我们自定义的注解,这也是@ComponentScan的原理
在@SpringbootApplication启动的时候,也可以通过@ConpomentScan设置includeFilters属性,让项目扫描一些我们自定义的注解,这也是@ComponentScan的原理
includeFilters使用case
让@Component生效,不然Spring也不认识它,不认识@Component怎么扫描路径呢
因为new ClassPathBeanDefinitionScanner(this);
所以可以用ClassPathBeanDefinitionScanner类中的文件扫描能力;
所以可以用ClassPathBeanDefinitionScanner类中的文件扫描能力;
register(component.class)
只是把我们自己写的bean作为配置类注入进来,主要就是解析类上面的注解,一般都在这里获取基本包
Spring会从基本包,使用解析器开始扫描@Component;
如果只有@SpringBootApplication,没有显式使用@ComponentScan,Spring Boot会默认从@SpringBootApplication所在的包开始扫描及其子包;
如果只有@SpringBootApplication,没有显式使用@ComponentScan,Spring Boot会默认从@SpringBootApplication所在的包开始扫描及其子包;
只是把我们自己写的bean作为配置类注入进来,主要就是解析类上面的注解,一般都在这里获取基本包
refresh()
真正ioc容器启动的refresh方法
postProcessBeanFactory(beanFactory);
一个扩展点,允许操作beanFactory
一个扩展点,允许操作beanFactory
比如给某个类强行赋值
invokeBeanFactoryPostProcessors(beanFactory);
核心方法:加载剩下的类进入bdMap,包括@Bean
现在AutowiredAnnotationBeanPostProcessor、ConfigurationClassPostProcessor都有了是不是得开始用了
,就是要开始扫描我们自己写的类放到BeanDefineMap里了!!
唯一要注意的是我们自己写代码会写@Configuration配合@Bean这种方式,这种嵌套的类是
1、先加载基本类到BeanDefineMap
2、再加载@BeanDefine修饰的方法到BeanDefineMap
核心方法:加载剩下的类进入bdMap,包括@Bean
现在AutowiredAnnotationBeanPostProcessor、ConfigurationClassPostProcessor都有了是不是得开始用了
,就是要开始扫描我们自己写的类放到BeanDefineMap里了!!
唯一要注意的是我们自己写代码会写@Configuration配合@Bean这种方式,这种嵌套的类是
1、先加载基本类到BeanDefineMap
2、再加载@BeanDefine修饰的方法到BeanDefineMap
先创建ConfigurationClassPostProcessor,放入单例池
因为扫描@Component需要用到这个PostProcess;
扫描@Component是在ConfigurationClassPostProcessor内部实现的
因为扫描@Component需要用到这个PostProcess;
扫描@Component是在ConfigurationClassPostProcessor内部实现的
注册@Component修饰的基本类到bdMap;
也包括@Import(xxx.class) 导入的类
也包括@Import(xxx.class) 导入的类
直接读取基本包下的全部@Component,注意这里只会获取到@Component修饰的类,如果A类是@Configuration B类是@Bean,那么只会注册A类
注册到bdMap
因为@Component修饰的类中可能还有类需要注入到ioc容器,
所以这步要注册@Bean到bdMap中;
所以这步要注册@Bean到bdMap中;
但是@Bean修饰的毕竟是方法,和正常的类肯定不太一样;
所以@Bean修饰的这个方法对应的BeanDefine,多了一个字段叫factoryMethodName,值就是@Bean修饰方法的全限定类名;
等后续我们通过BeanDefineMap来实例化Bean的时候,会反射调用factoryMethodName这个方法,也就是执行我们@Bean修饰的方法,然后把返回值放进ioc 容器中;
所以@Bean修饰的这个方法对应的BeanDefine,多了一个字段叫factoryMethodName,值就是@Bean修饰方法的全限定类名;
等后续我们通过BeanDefineMap来实例化Bean的时候,会反射调用factoryMethodName这个方法,也就是执行我们@Bean修饰的方法,然后把返回值放进ioc 容器中;
finishBeanFactoryInitialization();
核心方法:循环bdMap里面的BeanDefine实例化,放到ioc容器,会跳过懒加载;
区分单例还是原型,单例每次都从单例池拿,原型每次都创建新的不会放到单例池;
核心方法:循环bdMap里面的BeanDefine实例化,放到ioc容器,会跳过懒加载;
跳过懒加载的bean
区分单例还是原型,单例每次都从单例池拿,原型每次都创建新的不会放到单例池;
开始创建一个Bean,也就是准备执行Bean的生命周期;
注解启动
0 条评论
下一页
为你推荐
查看更多