Spring
Spring结构图
各个模块之间的依赖关系大概如下:
Spring的IOC运行流程
定位→加载→注册
IOC时序图:
简单整理下IOC过程 :
1.定位找到要加载的配置文件ClassPathResource res = new ClassPathresource("a.xml");
2.初始化ioc容器refreshBeanFactory(),并且调用obtainFreshBeanFactory()是注册容器的信息源和生命周期事件。
3.xmlBeanDefinitionReader调用loadBeanDefinitions()读取bean的配置资源并且调用documentLoader()方法转换成document。
4.将Document对象封装成BeanDefinition的BeanDefinitionHold对象(可以用BeanDefinitionHold.getBeanDefinition得到BeanDefinition对象),BeanDefinitionReaderUtils的registerBeanDefinition()方法向IOC容器中注册解析的bean。
5.用一个ConcurrentHashMap对象存beanDefinition.
Spring的DI的运行流程
DI介绍
当SpringIOC 容器完成了Bean定义资源的定位、载入和解析注册以后,IOC 容器中已经管理类Bean定义的相关数据,但是此时 IOC容器还没有对所管理的 Bean进行依赖注入,依赖注入在以下两种情况发生:
1)、用户第一次调用getBean()方法时,IOC 容器触发依赖注入。
2)、当用户在配置文件中将<bean>元素配置了lazy-init=false属性,即让容器在解析注册 Bean定义时进行预实例化,触发依赖注入。
DI时序图
简单整理DI过程:
1.首先调用createBeanInstance()方法生成 Bean所包含的 Java对象实例。
2.调用 populateBean()方法,对 Bean属性的依赖注入进行处理。
1)、属性值类型不需要强制转换时,不需要解析属性值,直接准备进行依赖注入。
2)、属性值需要进行类型强制转换时,如对其他对象的引用等,首先需要解析属性值,然后对解析后的属性值进行依赖注入。
3)、对于集合类型的属性,将其属性值解析为目标类型的集合后直接赋值给属性。
4)、对于非集合类型的属性,大量使用了JDK的反射机制,通过属性的getter()方法获取指定属性注入以前的值,同时调用属性的 setter()方法为属性设置注入后的值。
Spring的AOP运行流程
aop前序小概念
1、切面(Aspect) 面向规则,具有相同规则的方法的集合体
2、通知(Advice) 回调
3、切入点(Pointcut)需要代理的具体方法
4、目标对象(Target Object)被代理的对象
5、AOP代理(AOP Proxy)主要两种方式:JDK、CGLib
6、前置通知(Before Advice)在invoke Pointcut之前调用,织入的方法
7、后置通知(After Advice)Pointcut之后调用,织入的方法
8、返回后通知(After Return Advice)返回值为非Void,织入的方法
9、环绕通知(Around Advice)只要触发调用,织入的方法
10、异常通知(After Throwing Advice)Pointcut抛出异常,织入的方法
AOP时序图
简单整理AOP过程:
1.SpringAOP是通过接入BeanPostProcessor后置处理开始的。他是一个监听器,可以监听容器触发的Bean声明周期事件。
2.AbstractAutowireCapableBeanFactory 类对容器生成的Bean添加后置处理器。
3.根据对象选择不同的代理对象。
4.获取方法上的通知链,根据通知链上的order属性在方法之前或者之后执行通知。
FactoryBean和BeanFactory区别
FactoryBean:内部是一种&开头作为beanName 。Spring中所有的工厂bean都是FactoryBean,因为工厂本身也是由容器管理,由root创建,都是单例放在IOC容器中,要从容器中取出要在名字前面价格&符号。
BeanFactory:Bean工厂的顶层规范,只是定义了getBean()等方法,就像是java中的obejct类。用beanFactory.getBean(String name)得到的是factoryBean生成出来的普通的bean类,要想得到factoryBean类,需要加&符号。
SpringMVC
SpringMVC九大组件
1.HandlerMappings
2.HandlerAdapters
3.HandlerExceptionResolvers
4.ViewResolvers
5.RequerstToViewNameTranslator
6.Localeresolver
7.ThemeResolver
8.MultiPartResolver
9.FlashMapManager
Spring MVC时序图
SpringMVC处理过程
1.初始化九大组件。dispatcherServlet是springmvc中前段控制器负责接收request请求并且将request转发给对应的处理组件。
2.dispatcherServlet将request请求教给handlermapping处理器映射器,生成处理器对象以及处理器拦截器并且返回dispatcherServlet.
3.dispatcherServlet调用HandlerAdapter处理器适配器,handlerAdapter经过适配调用具体的处理器controller,controller处理完返回modelandview。
4.dispatcherServlet将modleAndView传给viewReslover视图解析器解析返回view。
5.dispatcherServlet根据view进行渲染视图相应用户。
SpringMVC优化建议
1.controller如果能保持单例,尽量使用单例。
2.@RequestParam给具体的参数和url中的参数进行一对一匹配。
3.springMVC并没有对url和method的对应关系进行缓存,只缓存了url和controller进行了缓存。如果可以的话可以自己设计缓存。