![da5d180916c27f12aaf8d630377e6009.png](https://img-blog.csdnimg.cn/img_convert/da5d180916c27f12aaf8d630377e6009.png)
面试题3. Spring中bean的生命周期?
![4b016a555a8b5fa1e63cb17f8238a796.png](https://img-blog.csdnimg.cn/img_convert/4b016a555a8b5fa1e63cb17f8238a796.png)
补充:当在执行第六步之后,如果Spring初始的这个bean的作用域是Prototype的话,之后的过程就不归Spring来去管理了,直接就交给用户就可以了。
面试题4. 说一下SpringMVC中的拦截器和Servlet中的filter有什么区别?
- 首先最核心的一点他们的拦截侧重点是不同的,SpringMVC中的拦截器是依赖JDK的反射实现的,SpringMVC的拦截器主要是进行拦截请求,通过对Handler进行处理的时候进行拦截,先声明的拦截器中的preHandle方法会先执行,然而它的postHandle方法(他是介于处理完业务之后和返回结果之前)和afterCompletion方法却会后执行。并且Spring的拦截器是按照配置的先后顺序进行拦截的。
- 而Servlet的filter是基于函数回调实现的过滤器,Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(比较泛的,比如登录不登录之类)
面试题5. spring容器的bean什么时候被实例化?
(1)如果你使用BeanFactory作为Spring Bean的工厂类,则所有的bean都是在第一次使用该Bean的时候实例化
(2)如果你使用ApplicationContext作为Spring Bean的工厂类,则又分为以下几种情况:
- 如果bean的scope是singleton的,并且lazy-init为false(默认是false,所以可以不用设置),则 ApplicationContext启动的时候就实例化该Bean,并且将实例化的Bean放在一个map结构的缓存中,下次再使 用该 Bean的时候,直接从这个缓存中取
- 如果bean的scope是singleton的,并且lazy-init为true,则该Bean的实例化是在第一次使用该Bean的时候进 行实例化
- 如果bean的scope是prototype的,则该Bean的实例化是在第一次使用该Bean的时候进行实例化
面试题6. Spring的几种注入方式说一下?
(1)构造方法注入:
![6b280fbf4886d89c16fc0ecd3b1d3d2c.png](https://img-blog.csdnimg.cn/img_convert/6b280fbf4886d89c16fc0ecd3b1d3d2c.png)
注意的点:
- 如果有多个构造参数,那么与构造方法参数列表参数的顺序无关
- 如果有多个构造方法且参数顺序不同,那么会按第一个构造方法进行注入
(2)set方法注入:
![d1028f11799978051707b4a1e4e123e4.png](https://img-blog.csdnimg.cn/img_convert/d1028f11799978051707b4a1e4e123e4.png)
注意的点:
- 其实set方法的注入原理就是,spring会将name值的每个单词首字母转换成大写,然后再在前面拼接上"set"构成一个方法名,然后去对应的类中查找该方法,通过反射调用,实现注入
- 如果通过set方法注入属性,那么spring会通过默认的空参构造方法来实例化对象,所以如果在类中写了一个带有参数的构造方法,一定要把空参数的构造方法写上,否则spring没有办法实例化对象,导致报错。
(3)注解的方式注入:
- @Resource:java的注解,默认以byName的方式去匹配与属性名相同的bean的id,如果没有找到就会以byType的方式查找,如果byType查找到多个的话,使用@Qualifier注解(spring注解)指定某个具体名称的bean
- @Autowired:spring注解,默认是以byType的方式去匹配类型相同的bean,如果只匹配到一个,那么就直接注入该bean,无论要注入的 bean 的 name 是什么;如果匹配到多个,就会调用 DefaultListableBeanFactory 的 determineAutowireCandidate 方法来决定具体注入哪个bean。determineAutowireCandidate 方法的内容如下:
![7dd38ffdc48f366f972782b3dd80ada3.png](https://img-blog.csdnimg.cn/img_convert/7dd38ffdc48f366f972782b3dd80ada3.png)
需要java架构资料的私信我即可获得