Skip to content

Commit ba9776a

Browse files
committed
增加Spring内容的总结
1 parent a25c1b5 commit ba9776a

File tree

1 file changed

+87
-0
lines changed

1 file changed

+87
-0
lines changed

README-Spring.md

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
# Java 基础 #
2+
3+
知识点汇总github地址 [https://github.com/bage2014/interview](https://github.com/bage2014/interview)
4+
Spring 实践demo地址[https://github.com/bage2014/spring-study](https://github.com/bage2014/spring-study)
5+
6+
## Spring 理论基础 ##
7+
8+
### 谈谈你对Spring的理解 ###
9+
关键点
10+
- 企业框架,目前最流行,没有之一
11+
- AOP、IOC、Spring MVC
12+
13+
### Spring中用到了哪些设计模式 ###
14+
- 工厂模式,比如 BeanFactory
15+
- 代理模式,在Aop实现中用到了JDK的动态代理
16+
- 单例模式,Bean的创建默认就是单利的
17+
18+
### IoC的启动过程 ###
19+
- Resource文件的定位,即找到bean的配置文件
20+
- 通过特定的reader解析该bean配置文件,抽象成beanDefinition类
21+
- 将beanDefinition向容器注册,写入到一个大的HashMap中
22+
23+
24+
### Spring 容器启动过程 ###
25+
26+
27+
### BeanFactory 和 ApplicationContext 区别 ###
28+
参考链接:[https://blog.csdn.net/lxyso/article/details/45446757](https://blog.csdn.net/lxyso/article/details/45446757)[https://www.cnblogs.com/aspirant/p/9082858.html](https://www.cnblogs.com/aspirant/p/9082858.html)
29+
30+
- 功能,BeanFactory负责读取bean配置,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的声明周期;ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了国际化支持、资源访问、事件传递、队Web的支持等功能
31+
- BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化;而ApplicationContext则相反,它是在容器启动时,一次性创建了所有的Bean。
32+
- BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册
33+
34+
### Bean 的生命周期 ###
35+
代码实现 [https://github.com/bage2014/study/tree/master/study-spring/src/main/java/com/bage/lifecircle](https://github.com/bage2014/study/tree/master/study-spring/src/main/java/com/bage/lifecircle)
36+
37+
1. 实例化一个Bean,也就是我们通常说的new
38+
2. 按照Spring上下文对实例化的Bean进行配置,也就是IOC注入
39+
3. 如果这个Bean实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,此处传递的是Spring配置文件中Bean的ID
40+
4. 如果这个Bean实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(),传递的是Spring工厂本身(可以用这个方法获取到其他Bean)
41+
5. 如果这个Bean实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文,该方式同样可以实现步骤4,但比4更好,以为ApplicationContext是BeanFactory的子接口,有更多的实现方法
42+
6. 如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用After方法,也可用于内存或缓存技术
43+
7. 如果这个Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法
44+
8. 如果这个Bean关联了BeanPostProcessor接口,将会调用postAfterInitialization(Object obj, String s)方法
45+
注意:以上工作完成以后就可以用这个Bean了,那这个Bean是一个single的,所以一般情况下我们调用同一个ID的Bean会是在内容地址相同的实例
46+
9. 当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean接口,会调用其实现的destroy方法
47+
10. 最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法
48+
49+
### Bean的作用域 ###
50+
51+
- **singleton**(默认): 在Spring的IoC容器中只存在一个对象实例,所有该对象的引用都共享这个实例。Spring 容器只会创建该bean定义的唯一实例,这个实例会被保存到缓存中,并且对该bean的所有后续请求和引用都将返回该缓存中的对象实例,一般情况下,无状态的bean使用该scope。
52+
- **prototype**:每次对该bean的请求都会创建一个新的实例,一般情况下,有状态的bean使用该scope。
53+
- **request**:每次http请求将会有各自的bean实例,类似于prototype。
54+
- **session**:在一个http session中,一个bean定义对应一个bean实例。
55+
- **global session**:在一个全局的http session中,一个bean定义对应一个bean实例。典型情况下,仅在使用portlet context的时候有效。
56+
57+
### AOP ###
58+
59+
#### 实现原理 ####
60+
默认,接口基于JDK动态代理,类为cglib
61+
62+
#### 注意事项 ####
63+
- 嵌套失效问题
64+
- final类直接报错问题(动态代理的实现原理)
65+
66+
### Spring 事务 ###
67+
68+
#### 实现原理 ####
69+
基于AOP,所以,嵌套的事务会失效
70+
71+
#### 传播机制 ####
72+
- 1
73+
- 2
74+
- 3
75+
- 4
76+
77+
### Spring MVC ###
78+
#### 请求过程 ####
79+
1. 用户请求DispatchServlet
80+
2. DispatchServlet根据请求路径调用具体HandlerMapping返回一个HandlerExcutionChain
81+
3. DispatchServlet调用HandlerAdapter适配器
82+
4. HandlerAdapter调用具体的Handler处理业务
83+
5. Handler处理结束返回一个具体的ModelAndView给适配器
84+
6. 适配器将ModelAndView给DispatchServlet
85+
7. DispatchServlet把视图名称给ViewResolver视图解析器
86+
8. ViewResolver返回一个具体的视图给DispatchServlet
87+
9. 渲染视图,展示给用户

0 commit comments

Comments
 (0)