SPRING IOC:
总结:
1.Spring IOC容器主要有继承体系底层的BeanFactory、高层的ApplicationContext和WebApplicationContext
2.容器启动原理:Spring应用的IOC容器通过tomcat的Servlet或Listener监听启动加载;Spring MVC的容器由DispatchServlet作为入口加载;Spring容器是Spring MVC容器的父容器
3.容器加载Bean原理:
1) BeanDefinitionReader读取Resource所指向的配置文件资源,然后解析配置文件。配置文件中每一个<bean>解析成一个BeanDefinition对象,并保存到BeanDefinitionRegistry中;
2) 容器扫描BeanDefinitionRegistry中的BeanDefinition;调用InstantiationStrategy进行Bean实例化的工作;使用BeanWrapper完成Bean属性的设置工作;
3) 单例Bean缓存池:Spring 在 DefaultSingletonBeanRegistry 类中提供了一个用于缓存单实例 Bean 的缓存器,它是一个用 HashMap 实现的缓存器,单实例的 Bean 以 beanName 为键保存在这个HashMap 中。
Bean有自己的生命周期: 如果在<bean>中指定 Bean 的作用范围为 scope=“prototype”,将 Bean 返回给调用者,调用者负责 Bean 后续生命的管理, Spring 不再管理这个 Bean 的生命周期。如果作用范围设置为 scope=“singleton”,则将 Bean 放入到 Spring IoC 容器的缓存池中,并将 Bean引用返回给调用者, Spring 继续对这些 Bean 进行后续的生命管理;
来源:
https://zhuanlan.zhihu.com/p/29344811
============================================================================
SPRING AOP:
AOP实现中,可以看到三个主要的步骤,一个是代理对象的生成,然后是切面的织入,然后是执行拦截器链。
1.Spring AOP代理对象的生成:
Spring提供了两种方式来生成代理对象: JDKProxy和Cglib,具体使用哪种方式生成由AopProxyFactory根据AdvisedSupport对象的配置来决定。默认的策略是如果目标类是接口,则使用JDK动态代理技术,否则使用Cglib来生成代理。Spring使用JDK来生成代理对象,具体的生成代码放在JdkDynamicAopProxy这个类中。
2.切面的织入
获取可以应用到此方法上的通知链,Advised中配置能够应用到连接点或者目标类的Advisor全部被转化成了MethodInterceptor.
3.执行拦截器链
如果得到的拦截器链为空,则直接反射调用目标方法,否则创建MethodInvocation,调用其proceed方法,触发拦截器链的执行,
注意:
CGLib不能对声明为final的方法进行代理,因为CGLib原理是动态生成被代理类的子类。
JDK代理三要素Proxy.newProxyInstance(类加载器,目标接口,InvocationHandler实现),JDKDynaimicAopProxy实现了InvocationHandler接口,并使用了AdvisedSupport中存在的目标接口,及设置的类加载器,进行JDK的动态代理。
CGLIB创建代理主要是创建Enhancer enhancer,并通过AdvisedSupport设置相应的属性,比如目标类rootClass,如果由接口合并接口给代理类,最主要的是设置Callback集合和CallbackFilter,使用CallBackFilter可以根据方法的不同使用不同的Callback进行拦截和增强方法。其中最主要的使用于AOP的Callback是DynamicAdvisedInterceptor。
参考链接:
https://www.ibm.com/developerworks/cn/java/j-lo-springaopcglib/index.html
https://www.2cto.com/kf/201603/496290.html
=====================================================================================================
SPRING MVC
SpringMVC流程
1、 用户发送请求至前端控制器DispatcherServlet。
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet调用HandlerAdapter处理器适配器。
5、 HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6、 Controller执行完成返回ModelAndView。
7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、 ViewReslover解析后返回具体View。
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、 DispatcherServlet响应用户。
参考链接:
https://www.cnblogs.com/xiaoxi/p/6164383.html