spring面试题笔记
1、使用了Spring框架的好处是什么?
- 轻量级:spring是轻量级框架,无侵入
- 控制反转(ioc):spring通过控制反转来实现松耦合,对象给出他们的依赖,而不是创建和查找依赖的对象
- 面向切面编程:spring支持面向切面编程,并且支持把业务逻辑和系统服务分开
- 容器:spring包含并管理应用中对象的生命周期
- mvc框架:spring的web框架是一个很好的框架,是web框架的一个很好的替代品
- 事务管理:spring自身是没有事务,但是提供了一套持续的事务管理接口,可以通过配置文件或者注解来实现
- 异常处理:spring提供了全局的异常处理机制,只需要申明一个全局的异常处理器,就可以捕获所有异常。
2、spring由哪些模块组成
- 核心容器:提供了spring框架的核心功能。BeanFactory是spring核心容器的只要组件。它通过控制反转将应用程序的配置和依赖性规范与实际的应用程序代码分开,这是整个spring的基础。
- spring context 模块:通过配置文件,向spring框架提供上下文信息。它构建在BeanFactory之上,另外增加了国际化,资源访问等功能。
- spring aop 模块:spring提供了面向方面编程的功能,因为spring的核心是基于控制反转的,所以可以很容易地使spring的依赖注入为aop提供支持。
- spring dao 模块:提供了一个简单而又有效的jdbc应用,使用它的dao就足以应付开发人员的日常应用了。
- spring orm 模块:spring除了有自己的jdbc应用之外,还提供了对其他一些orm框架的支持。基于spring的良好设计,这些开源框架都可以和spring进行良好的结合。
- spring web 模块:提供了简化的除了多部分请求以及将请求参数绑定到域对象的任务。
- spring mvc:spring提供了MVC2模式的实现,使用起来非常方便,但它不强迫开发人员使用。如果开发人员对其他的MVC框架比较熟悉,仍然可以使用它们。spring对此提供了很好的支持。
3、什么是IOC容器
- spring IOC负责创建对象,管理对象(通过依赖注入),装配对象,配置对象,并且管理这些对象的生命周期
4、IOC的优点
- ioc或者依赖注入把应用代码量降到最低
- 测试更加方便,单元测试不在需要单例和JNDI查找机制
- 最小的代价和最小的侵入性实现了松散耦合
- ioc容器支持加载服务时的饿汉初始化和懒加载
5、什么是依赖注入
- 依赖:一个类或者对象,使用另一个类或者对象的功能时,我们说前者依赖后者
- 注入:在spring框架中,依赖注入意味着将一个对象所依赖的对象交给容器来创建和管理,而不是由对象自己管理
6、spring的ioc依赖注入方式有哪些?
- 构造器注入:通过构造器将依赖注入到对象中
- 通过setter注入:通过setter方法将依赖注入到目标对象中
- 接口注入:通过自定义接口将依赖注入到目标对象中
- 注解注入:通过使用注解标识来将依赖注入到目标对象中
- 自动装配:spring会自动为目标对象注入依赖,可以通过设置骚麦类型和范围来自动注入
7、什么是bean?
- spring bean 是被实例,装配和管理的Java对象
- spring容器会自动完成@bean对象的实例
- 创建应用对象之间的协作关系的行为称为:装配,这就是依赖注入的本质
8、bean的作用域
- 单例(singleton):在容器中,一个bean定义,只会有一个对应的bean实例
- 多例(prototype):在容器中,一个bean定义,可以有多个对应的bean实例
- request:一个bean定义对应单个HTTP请求的生命周期,每个http请求都有一个自己的bean实例,且该实例只在这个http请求的生命周期中有效。
- session:一个bean定义对应单个http session的生命周期,每个http session都会有一个bean实例,且该实例仅在这个http session的生命周期中有效。
- application:一个bean的定义对应于单个servletcontext的生命周期,该作用域仅适用于WebApplicationContext环境。
- websocket:一个bean定义对应于单个websocket的生命周期,该作用域仅适用于WebApplicationContext环境。
9、bean的生命周期
- 实例化-依赖注入之前已经创建的Java对象,但是spring bean对外不可用
- 依赖注入
- BeanNameAware BeanFactoryAware(类似的xxxaware方法)方法执行啦!(xxxAware可以让bean获取spring容器中的服务)
- 初始化前-BeanPostProcessor before方法
- InitialingBean 接口的方法执行
- 初始化
- 初始化后-BeanPostProcessor after方法
- bean的使用
- DisposableBean接口的方法执行
- 销毁bean
10、Spring 框架中的单例 bean 是线程安全的吗?
- spring 中的单例bean,所有的线程都是共享bean,所以就会存在资源竞争问题,但如果bean是一个无状态的,只有查询操作,那是不会存在线程安全的
11、静态代理和动态代理
- 静态代理:为目标对象提前写好代理对象,来对目标进行功能增强
- 优点:不会对原代码进行入侵
- 缺点:当需要代理多个类的时候,由于代理对象要实现与目标对象一致的接口,有两种方式:
- 只维护一个代理类,由这个代理类实现多个接口,但是这样就导致代理类过于庞大
- 新建多个代理类,每个目标对象对应一个代理类,但是这样会产生过多的代理类
- 当接口需要增加、删除、修改方法的时候,目标对象与代理类都要同时修改,不易维护。
- 动态代理:JDK动态代理和CGLib动态代理
- JDK动态代理:基于Java反射机制实现,必须要实现了接口的业务类才能用这种办法生成代理对象
- CGLib动态代理:基于ASM机制实现,通过生成业务类的子类作为代理类。
- jdk动态代理的优势:
- 最小化依赖关系,减少依赖意味着简化代码开发和维护
- 平滑进行jdk版本升级,而字节码类库通常需要进行更新以保证在新版 Java 上能够使用。
- 代码实现简单。
- CGLib动态代理优势:
- 无需实现接口,达到代理类无侵入
- 只操作我们关心的类,而不必为其他相关的类增加工作量
- 高性能