java面试题(Spring)
Spring
1.谈谈对Spring的理解
spring是一个开源框架;是一个基石可以和其他的框架无缝整合;是为了简化企业开发而生的,使得开发变得更加的优雅和简洁;是一个IOC和AOP的容器框架。
优势:
1.生态圈强大
2.低侵入式设计,代码的污染低
3.独立于各种服务器
4.ioc降低了业务对象的复杂性,提高了组件之间的解耦
5.高度开放,可以自由选择Spring的全部或部分
2.Spring是如何简化开发的?
1.基于POJO的轻量级和最小侵入性编程
2.通过依赖注入和面向接口实现松耦合
3.基于切面和惯例进行声明式编程
4.通过切面和模板减少样板式代码
3.AOP的理解
面向切面编程,是一种可配置的、可插拔的程序结构。从Spring的角度来说,AOP最大的用途在于提供了事务管理的能力,即只关注想关注的事,其余的事都交给别人去干。在AOP中即事务管理是关注点,而访问数据库是想做的且必须要做的事,那么Spring就会在访问数据库之前自动开启事务,在访问数据库结束之后自动提交或回滚事物。
4.IOC的理解
控制反转,也可称为依赖倒置。首先先了解依赖的概念,从程序的角度看即A要调用B的方法,就必须主动获取B的实例,才可以调用b对象。而依赖倒置的意思就是不需要主动获取B的实例,而是由Spring将B的实例自动实现。Spring实现依赖注入的方式是动态代理。
5.Spring支持的bean作用域
- 单例:默认,每个容器只有一个bean实例,由BeanFactory自身来维护;
- 原型:容器中就有多个实例,每个bean都会有一个实例,每次注入都会创建新的实例
- Request:每个http请求创建一个单例对象,单个请求中复用
- Session:每个session都有一个bean,session过期,bean失效
- application:生命周期内复用一个单例对象
- websocket:生命周期内复用一个单例对象
6.Spring的事务传播机制
多个事务方法相互调用,事务如何在这些方法间传播?
- 如果有就加入,如果没有事务,就创建一个;
- 如果有就加入,如果没有事务,就以非事务方法执行
- 如果有就加入,如果没有事务,就抛出异常
- 创建一个新事务,如果有就挂起
- 以非事务方法执行,如果有就挂起
- 不使用事务,如果存在,抛出异常
- 如果存在,就嵌套在事务中执行
7.Spring的事务什么时候会失效
- 发生自调用,类里面用this调用本类方法
- 方法不是public
- 数据库不支持事务
- 没有被spring管理
- 抛出异常,事务没有回滚
8.Spring bean的生命周期
-
- 实例化bean
- 设置属性值
- 调用BeanNameAware的setBeanName方法
- 调用BeanNameAware的setBeanFactory方法
- 调用ApplicationContextAware的setApplicationContext方法
- 调用BeanPostProcessor的初始化方法
- 调用InitializingBean的afterPropertiesSet方法
- 调用初始化方法
- 调用BeanPostProcessor的初始化后的方法
- 把bean放入单例池
- 使用bean
- 关闭时调用destory方法
9.Bean是线程安全的吗?
如果bean无状态,则是安全的
如果bean有状态,则是不安全的
10.BeanFactory和ApplicationContext有什么区别?
都是bean容器;
- ApplicationContext是BeanFactory的子接口
- ApplicationContext提供了更完整的功能
- ApplicationContext更占用空间
- BeanFactory以编程的方式创建,ApplicationContext以编程的方式、申明的方式创建
11.spring事务的实现方式原理以及隔离级别
事务的实现方式:
1.编程式:通过代码控制逻辑
2.声明式:通过注解实现
事务的实现方式原理:
其实事务的操作本来应该是由数据库来进行控制,但是为了方便用户进行业务逻辑的操作,spring对事务功能进行了扩展实现,一般我们很少会用编程式事务,更多的是通过添加@Transactional注解来进行实现,当添加此注解之后事务的自动功能就会关闭,有spring框架来帮助进行控制。
其实事务操作是AOP的一个核心体现,当一个方法添加@Transactional注解之后,spring会基于这个类生成一个代理对象,会将这个代理对象作为bean,当使用这个代理对象的方法的时候,如果有事务处理,那么会先把事务的自动提交给关系,然后去执行具体的业务逻辑,如果执行逻辑没有出现异常,那么代理逻辑就会直接提交如果出现任何异常情况,那么直接进行回滚操作,当然用户可以控制对哪些异常进行回滚操作。
隔离级别:
- 未提交读:可能看到其他事务中未提交的数据(脏读)
- 串行化:强制事务排序,使之不会发生冲突;执行效率低,使用的场景不多
- 可重复读:能确保同一事务多次查询的结果一致(幻读)
- 提交读:能读取到已经提交事务的数据(不可重复读)
12.Spring容器启动流程是怎样的?
- 创建spring容器
- 扫描得到BeanDefinition对象,存入map中
- 筛选得到BeanDefinition进行创建bean(其中包含推断构造方法、实例化、属性填充、初始化前、初始化、初始化后)
- 创建完成后发布容器启动事件
- spring启动结束
13.Spring用到了哪些设计模式
工厂、适配器、访问者、装饰器、委派、代理、观察者、策略、模板、责任链
14.spring注入的方式
- 构造方法注入
- set方法注入
- 属性注入
15.bean对象和普通对象之间的区别
大部分是一样的,只是不同过程中的称呼不同;普通对象经过依赖注入等过程后,属性得到赋值,成为Bean对象。
16.什么是bean的自动装配?有哪些方式
bean的自动装配指的是bean的属性值在进行注入的时候通过某种特定的规则和方式去容器中查找,并设置到具体的对象属性中;
方式:
1.no:缺省
2.byName:根据属性名称自动装配
3.byType:根据类型自动装配
4.constructor:在构造函数参数的byType方式
5.autodetect:如果找到默认的构造函数,使用自动装配构造;否则使用按类型自动装配
17.依赖注入是如何实现的?
对无参构造的对象进行判断,看哪些属性上面存在@Autowired注解,如果存在注解,就利用反射给当前Service类的对象中的属性赋值
18.
SpringMVC
1.springmvc概述。springmvc优点
SpringMvc 是 spring 的一个模块,基于 MVC 的一个框架,无需中间整合层来整合
优点:
-
它是基于组件技术
-
不依赖与servlet
-
可以使用任何视图
-
易于拓展
2.springmvc的运行原理
1. 客户端请求提交到DispatcherServlet
2. 由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller
3. DispatcherServlet将请求提交到Controller
4. Controller调用业务逻辑处理后,返回ModelAndView
5. DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图
6. 视图负责将结果显示到客户端
3.springmvc的工作流程
1.用户发起请求到前端控制器
2.前端控制器请求处理器映射器去查找处理器
3.找到以后处理器映射器向前端控制器返回
4.前端控制器调用处理器适配器去执行处理器
5.处理器适配器去执行处理器
6.处理器执行完给处理器适配器返回ModelAndView
7.处理器适配器向前端控制器返回ModelAndView
8.前端控制器请求视图解析器去进行视图解析
9.视图解析器像前端控制器返回View
10.前端控制器对视图进行渲染
11.前端控制器向用户响应结果
4.springmvc的九大组件
1.处理器映射器
2.适配器
3.异常处理器
4.视图解析器
5.视图名称翻译器
6.当前环境处理器
7.主题处理器
8.文件处理器
9.参数传递管理器
5.springmvc常用注解
@Component:泛指各种组件
@Controller:控制层
@Service:业务层
@Repository:数据访问层
@Bean:导入第三方包里面的注解
@Import:导入到容器中的组件
6.@Autowired和@Resource之间的区别
Autowired默认是按照类型装配注入的,默认情况下它要求依赖对象必须存在;Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入
7.SpringMvc 的控制器是不是单例模式,如果是,有什么问题,怎么解决?
是单例模式,所以在多线程访问的时候有线程安全问题,不要用同步,会影响性能的,解决方案是在控制器里面不能写字段