總結:
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