spring是一个轻量级的IOC和AOP容器框架。
IOC:控制反转,以前对象由自己创建和管理,现在交给spring容器管理,负责对象的生命周期和对象间的依赖关系。
工作原理:工厂模式和反射机制,通过读取XML或者配置类获取需要创建实现的Bean,并通过反射将其创建。
BeanFactory:负责读取bean配置文件,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的生命周期。容器延迟加载,在使用Bean时才实例化。
ApplicationContext:继承BeanFactory,容器即时加载所有Bean。
1.容器启动阶段:BeanDenifinionReader读取和解析配置文件,生成BeanDefinition对象,保存到BeanDefinitionRegistry中,BeanFactoryPostProcess增强BeanDefinition
2.Bean实例化阶段:将BeanDenifition转化成BeanWrapper,属性注入,初始化Bean,注册DisposableBean,使用完bean后,通过回调的方式调用DisposableBean的destory方法或者设置destory-method方法进行销毁Bean
2.1初始化Bean:处理Aware接口——执行BeanPostProcess的前置方法——调用InitializingBean的afterPropertiesSet或者设置init-method方法——执行BeanPostProcess的后置方法
2.1.1Aware接口
如果Bean实现BeanNameAware接口,调用setBeanName方法
如果Bean实现BeanClassLoaderAware接口,调用setBeanClassLoader方法
如果Bean实现BeanFatoryAware接口,调用setBeanFactory方法
如果Bean实现ApplicationContextAware接口,调用setApplicationContext方法
spring的bean加载流程:Spring的Bean加载流程_张维鹏的博客-CSDN博客_spring bean加载过程
Spring中用到的设计模式
1.模板模式:指定义一个算法的骨架,并允许子类为一个或多个步骤提供实现。模板模式使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤,属于行为型设计模式。该模式包含一个抽象类和多个子类,抽象类定义多个抽象方法,这些方法都被顺序引用在final方法中。Spring中操作数据库以Template为结尾的类使用了该模式,如JdbcTemplate的doInConnection。
2.单例模式:指一个类只有一个实例,且该类能自行创建这个实例的一种模式,属于创建型模式。Spring中DefaultSingletonBeanRegistry.getSingleton使用该模式
3.工厂模式:指将创建对象的过程交给工厂进行处理,通过工厂提供给我们需要创建的对象,而不用自己直接去进行对象的创建,属于创建型模式。Spring中BeanFactory.getBean和FactoryBean.getObject上使用该模式。
4.代理模式:参考一文搞懂代理模式_deer-li的博客-CSDN博客_代理模式,属于结构型模式。Spring中JdkDynamicAopProxy实现了InvocationHandler接口。
5.观察者模式:Spring中的事件使用该模式。
6.策略模式:Spring对资源访问使用该模式。
7.装饰者模式:Spring对DataSource切换不同数据源使用该模式。
8.适配器模式:Spring使用HandlerAdapter调用不同的Handler使用该模式。
Spring解决循环依赖
先实例化A,放入三级缓存,然后属性注入B,会去走B的实例化流程,中间遇到A时从缓存中取,最后再初始化A。
SpringMvc的工作流程
用户将请求转发到DispatchSevlet——HandlerMapping——HandlerAdpate——Handler——Controller——ModelAndView——ViewResolver解析——view——渲染。
Spring事务传播机制
1.request:如果有事务,用当前事务执行,如果没有事务,起一个事务。
2.request_new:如果没有事务,起一个事务,如果有事务,将当前事务挂起,另起一个事务。
3.support:如果有事务,用当前事务执行,如果没有事务,就没事务执行。
4.not_support:如果有事务,将当前事务挂起,以非事务执行,如果没有事务,就没事务执行。
5.never:如果有事务,抛异常,如果没有事务,就没事务执行。
6.mandatory:如果有事务,用当前事务执行,如果没有事务,抛异常。
7.nested:如果有事务,外面事务回滚,里面也会回滚,如果没有事务,起一个事务。