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开始查找执行
额,暂时写这些。。。

浙公网安备 33010602011771号