Spring面试题学习总结(一)
感谢https://blog.csdn.net/a745233700/article/details/80959716
1、什么是Spring
1、Spring是一个高度灵活的轻量级框架,其目的是降低企业级应用开发的复杂度。
- 常见的配置方式有三种:基于XML的配置、基于注解的配置、基于Java的配置。
|
2、Spring框架优点
- Spring两大核心:IOC、AOP;
- IOC:创建对象以及管理对象之间的调用关系,避免硬编码造成程序的耦合;
- AOP:实现很多特定功能(安全、事务、日志、权限等);
- Spring是轻量的,基本的版本大约2MB;
- Spring被设计为侵入式设计,代码的污染极低,基于Spring的开发不需要依赖Spring API;
- Spring本身就是个容器,管理应用对象的生命周期;
- Spring支持其他优秀的框架(整合这一方面,Spring做的相当到位);
- Spring本身也提供了展现层(Spring MVC)和持久层(Spring JDBC)。
|
3、Spring 的七大模块
- Spring Core(核心容器)
生产和管理bean
- Spring Context(应用上下文)
提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等)
- Spring AOP(面向切面编程)
减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。可用于权限认证、日志、事务处理。
- Spring DAO(JDBC和DAO模块)对jdbc抽象,简化数据访问异常处理
- Spring ORM(对象关系映射)对现有ORM框架支持
- Spring Web(Web)提供了基本的面向Web的综合特性,(文件上传等)
- Spring Web MVC(MVC模块)MVC框架是一个全功能的构建Web应用程序的MVC实现
|
4、Spring Bean生命周期
- Bean的生命周期和servlet生命周期相似(实例化,初始init,doGet/doPost/service,销毁destroy)
- 个人理解(不扯源码)
- 实例化bean:首先类加载器读取*.java文件,生成*.class,读取*.class的所有信息存储到一个许多BeanDefinition的Map中,如果不手动干预,Spring就会将Map中的bean根据他的类型进行实例化,放到SpringIOC容器中,实例化完成。SpringIOC的存储形式是 ConcurrentHashMap
- 使用bean
- 使用完后准备清理bean(DisposableBean)
- 清理bean(destroy-method)
|
5、IOC
- Inversion of control 控制反转
- 将new对象的权利交给Spring容器,并让容器根据配置文件去创建实例和管理实例间的依赖关系
- Spring IOC的三种注入方式:构造器、setter方法注入、注解注入
|
6、AOP
面向切面编程,可以说是面向对象编程(OOP)的补充和完善,AOP适合定义横向的关系,例如日志功能,AOP利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面,使用"横切"技术,AOP把软件系统分为两个部分:核心关注点和横切关注点 AOP编程允许你把遍布于应用各层的功能分离出来形成可重用的功能组件 |
7、SpringAOP动态代理
- JDK动态代理
JDK动态代理只提供接口的代理,不支持类的代理。核心InvocationHandler接口和Proxy类 InvocationHandler 通过invoke()方法反射来调用目标类中的代码,动态地将横切逻辑和业务编织在一起;接着,Proxy利用 InvocationHandler动态创建一个符合某一接口的的实例, 生成目标类的代理对象。
- CGLib动态代理
Code Generation Library是一个代码生成的类库,可以在运行时动态的生成指定类的一个子对象,并覆盖其中的特定方法并添加增强代码,从而实现AOP。CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。 |
8、解释一下Spring AOP里面的几个名词
- 切面(aspect)
封装通用业务逻辑的组件,可以作用到其他组件上。由 pointcut 和 advice 组成, 它既包含了横切逻辑的定义, 也包括了连接点的定义
- 连接点(joinpoint)
程序运行中的一些时间点, 例如一个方法的执行, 或者是一个异常的处理
- 切点(pointcut)
就是提供一组规则(使用 AspectJ pointcut expression language 来描述) 来匹配joinpoint, 给满足规则的 joinpoint 添加 Advice
- 通知(advice) - 增强
由 aspect 添加到特定的 join point(即满足 point cut 规则的 join point) 的一段代码。
- 目标对象(target)
织入 advice 的目标对象.
- 织入(weaving)
将 aspect 和其他对象连接起来, 并创建 adviced object 的过程.根据不同的实现技术 |
9、Spring支持的几种bean的作用域
5种作用域
- 单例模式(singleton)Bean将只有一个实例,容器负责跟踪Bean实例的状态,负责维护Bean实例的生命周期行为
- 原型模式(prototype)一旦创建成功,容器不在跟踪实例,也不会维护Bean实例的状态
- Request只有在Web应用中使用Spring时,对于每次HTTP请求,使用request定义的Bean都将产生一个新实例
- Session 只有在Web应用中使用Spring时,对于每次HTTP Session,使用session定义的Bean都将产生一个新实例
- Globalsession 只有在Web应用中使用Spring时,每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。典型情况下,仅在使用portlet context的时候有效。
|
10、Spring 框架中都用到了哪些设计模式?
- 工厂模式:beanfactory
- 单例模式:Bean默认为单例模式
- 代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术
- 模板方法:用来解决代码重复的问题,RestTemplate, JpaTemplate
- 观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新
|
11、Spring事务的实现方式和实现原理:
Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。真正的数据库层的事务提交和回滚是通过binlog或者redo log实现的。 事务的种类 ①编程式事务管理使用TransactionTemplate ②声明式事务管理,其本质是通过AOP功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。 声明式事务优点:不需要在业务逻辑代码中掺杂事务管理的代码 声明式事务缺点:最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别 |
12、Spring的事务传播行为
- required:必须在事务中运行,如果没有,就创建新事物。
- Supports:支持事务,有没有事务都可以。
- Mandatory:当前没有事务就会抛出异常
- Required_new:新建事务,如果当前存在事务,就把当前事务挂起。
- Not_supported:不需要事务,如果存在事务中,当前事务会挂起,方法完成,事务继续
- Never:不能在事范围内执行,否则抛出
- Nested:不管存不存在事务,都会开启一个事务,当前存在就嵌套,不存在就搞一个新的
|
13、Spring中的隔离级别
- default:默认,使用后端数据库默认的隔离级别
- Read_uncommitted:允许读还未提交已变数据,导致脏、幻、不可重复读
- Read_committed:允许并发事务提交之后读,防止脏读,不能防幻、不可重复读
- Repeatable_read:对相同字段多次读取数据一致,幻读可能发生
- Serializable:完全服从ACID的隔离级别,性能是最差的
一般选择第二个提交读隔离级别,出现幻读和不可重复读,可以在特定场合使用悲观锁和乐观锁解决 |
14、Spring的自动装配
- XML配置5种自动装配
No:不进行自动注入 ByName:通过bean名称进行自动装配 ByType:参数类型 Constructor:构造方法 Autodetect:自动探测
- 基于注解方式
@Autowired注解 @Resource(不是Spring的,由J2EE提供,需要导入包javax.annotation.Resource) |
15、BeanFactory和ApplicationContext有什么区别?
BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring的容器。其中ApplicationContext是BeanFactory的子接口。
- BeanFactory:是Spring里面最底层的接口,包含了各种Bean的定义,读取bean配置文档,管理bean的加载、实例化,控制bean的生命周期,维护bean之间的依赖关系。
- ApplicationContext接口作为BeanFactory的派生,除了提供BeanFactory所具有的功能外,还提供了更完整的框架功能:继承MessageSource,因此支持国际化;统一的资源文件访问方式;提供在监听器中注册bean的事件;同时加载多个配置文件;载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层。
- BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化。
- ApplicationContext,它是在容器启动时,一次性创建了所有的Bean
- 相对于基本的BeanFactory,ApplicationContext 唯一的不足是占用内存空间。当应用程序配置Bean较多时,程序启动较慢
- BeanFactory通常以编程的方式被创建,ApplicationContext还能以声明的方式创建,如使用ContextLoader
- BeanFactory需要手动注册,而ApplicationContext则是自动注册
|