Spring 和 SpringMVC课堂笔记

Spring

Spring结构图

bd6e4bc3b64eb65f35656b69afdbc184a85.jpg

各个模块之间的依赖关系大概如下:

97cfae3a6303fa8ea76b0e9a410a67365ac.jpg

Spring的IOC运行流程

定位→加载→注册

070416e54885acbd576249ce6290438648e.jpg

IOC时序图:

8ddaecb1d9a45150b60c2213100b83bb7bf.jpg

简单整理下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定义时进行预实例化,触发依赖注入。

7c1a616fc1ad106a9214b67c42d997c330b.jpg

DI时序图

b01bd63039ff7c22f2720c4a0d7c7bcbe4a.jpg

简单整理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抛出异常,织入的方法

26be8ad26f85897a84acbe79a0dd301e545.jpg

AOP时序图

4c22b32a3aebcdc025684c82f805f0cc49e.jpg

简单整理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时序图

41af017a7ef79fc349855e29c6bde9f61fa.jpg

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进行了缓存。如果可以的话可以自己设计缓存。

 

转载于:https://my.oschina.net/yaojianpeng/blog/3080121

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值