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