spring

 

最近闲着没事,撸了一把spring源码,感触还是比较多的。以前看IOC和AOP和现在看,感觉有点不一样,哈哈。

 

随便写一点:

 

1 IOC创建

(1)creatBeanFactory方法开始创建一个beanFactory,顶层接口beanFactory(如果自己想用spring管理创建对象,用factoryBean,不用遵守这一套复杂流程),它有一个默认实现DefauListableBeanFactory。通过像Aware或者beanPostProcessor这些类来给Bean工厂设置一些参数

(2)工厂创建好还是生产小兵了,开始加载解析bean对象,通过xml或者注解来准备对象的beanDefinition

(3)beanFactoryPostProcessor开始处理一些扩展点,比如aop还有springmvc都是在这里开始加操作,通过PlaceHolderConfigurSupport,ConfigurationClassPostProcessor来实现

(4)beanPostProcessor开始注册,方便后续对Bean对象完成扩展。

(5)beanDefinition通过反射来循环创建来完成bean的实例化

(6)bean对象开始初始化(populateBean填充属性,通过调用Aware子类,调用beanPostProcessor一些前置后置完后对象的创建)

(7)生成完整Bean,可以通过getBean来调用

(8)销毁。判断是否DispoableBean接口,调用destoryMethod方法。

 

2 生命周期:

 

 

3 用到的设计模式

单例模式:bean都是默认单例

原型模式:prototype模式下

工厂模式:beanFactory

模板方法:postProcessBeanFactory,onRefresh,initPropertyValue

策略模式:xmlBeanDefinitionReader,PropertiesBeanDefinitionReader

观察者模式:listener,event,muliticast

适配器模式:Adapter

装饰者模式:beanWrapper

责任链模式:aop里面会用一个拦截器链

代理模式:动态代理

委托者模式 :delegate

 

4 spring如何解决循环依赖的、三级缓存

 

A对象注入B对象,B对象注入A对象,就相互注入了。一个对象的创建过程实例化和初始化是可以分开的,在spring里面,引入提前暴露这一说。

 

就比如说A对象完成了实例化未完成初始化,那就把对象放入二级缓存,等A对象完整放入到一级缓存,删除二级缓存。当取bean对象的时候优先取一级缓存,这样就解决了循环依赖。由于aop对象代理的存在,当一个对象需要代理的时候,需要先存在这个对象,而代理对象和这个被代理的对象又不能存在于一个容器中,所以设计了三级缓存。

 

5 aop

aop作为其中beanFactoryPostProcessor中一个很重要的拓展

(1)代理对象创建(advice,切面,切点cutPoint)

(2)通过cglib或者jdk动态代理实现(1,jdk动态代理需要依赖接口和实现类,利用拦截器(必须实现InvocationHandler)加上反射机制生成一个代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理 2,利用ASM框架,对代理对象类生成的class文件加载进来,通过修改其字节码生成子类来处理),Spring会自动在JDK动态代理和cglib之间转换

(3)执行方法调用生成字节码文件,找DynamicAdvisoredInterceptor中的intercepotor方法,从这里执行

(4)根据设置的通知生成拦截器链

(5)从拦截器链开始一步步执行,有一个cglibMethodInvocation的对象,从-1开始查找执行

 

额,暂时写这些。。。

 

posted @ 2021-04-22 20:07  kirsSun  阅读(94)  评论(0)    收藏  举报