05,spring是如何启动的
2021-05-07 16:59:58 0 举报
spring是如何启动的
作者其他创作
大纲/内容
呈现方式
完整bean对象
BeanFactory
通过context.getBean()来使用
加载
可以对BeanFactory中的属性任意修改
<bean id=dataSource class=com.alibaba.druid.pool.DruidDataSource> <property name=url value=${jdbc.url}>//这就是占位符</bean>
BeanFactoryPostProcessor
如果过想在容器不同的阶段做不同事观察者模式嵌套在ioc各个环节上的
检查是否配置初始化方法
如果Bean实现了BeanPostProcessor接口
调用初始化回调方法比如:下面按顺序1,先执行注解@PostConstructor2,在执行Bean 实现了InitializingBean接口3,最后执行xml里面的init-mothed
Spring在面没有接口的类实现代理时,使用了CGLIB
Environment接口
jdk是代理接口,私有方法(private)必然不会存在在接口里,所以就不会被拦截到
注解
供后期实例化的时候用循环调用
实现BeanFactoryPostProcessor接口
最终的BeanDefiniation(bean的定义信息)包括属性,初始方法,销毁方法但此时不是占位符
通过构造器,反射生成beanConstructor stor = clazz.getDeclareConstructor();Object obj=ctor.newInstance();
调用after方法
BeanDefinitionMap
Cglib
xml
使用
进行拦截
BeanPostProcessor
监听器
引入PostProcessor后置处理器/增强器
检查有没有实现各种Aware接口
bean定义
实例化和初始化就代表Bean的生命周期在refresh方法里面的finishBeanFactoryInitialization()
JDK
对应
反射默认单例非懒加载的bean
先有环境接下来就是创建工厂实例化bean
针对的操作对象
BeanFactoryPostProcessor接口里面就一个方法:postProcessBeanFactory()
对象工厂
给属性完成赋值操作
销毁
初始化
还有一个Listkey:类名value:beanDefinition
BeanPostProcessor接口前置处理postProcessBeforeInitialization()
封装对象
BeanFactory接口(spring容器)也是容器的入口
scope= \"singleton\"单例模式(singleton)多例模式(prototype)
调用befor的方法
这一步就有了bean的普通对象但是如果发现需要aop的功能因此需要生成动态代理的对象
为了提高扩展性
解析
spring基石:spring是一个生态
BeanDefiniation(存map中)(bean的定义信息)包括属性,初始方法,销毁方法但此时只是占位符
cglib是继承,private的方法照样不会出现在子类里,也不能被拦截
LoadBeanDefinition()IO流读取过来
针对操作对象
反射过程
动态代理两种方式
Bean
实例化
invokeBeanFactoryPostProcessors():
在堆内存分配空间,属性填充默认值
BeanDefinitionReader接口对配置进行解析父子关系
方便自定义对象获取容器对象比如:public class user implement BeanFactoryAware
populatebean方法完成注入set属性值,比如:bean name
解析property文件的System.getproperty()
Objenesis是一个轻量级的类库,作用是绕过一个构造器创建一个实例
使用Objenesis 使用proxy class构造一个proxy instance
调用所有的Processor实现类
外面可以通过BeanFactory容器入口修改Bean Definiation
调用aware接口的方法
完整的解析工作
先获取class对象
BeanPostProcessor接口后置处理postProcessAfterInitialization()
GC
进行扩展
在这一步里面的某一个后置处理器
用Objenesis构造这个代理实例时,并没有通过构造器初始化父类对象以及相关属性,所以属性为空
0 条评论
下一页