1. 什么是Spring框架,Spring框架主要包含哪些模块?
Spring是一个轻量级的IOC和AOP容器框架。是为Java应用程序提供基础性粪污的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求,常见的配置方式有三种:XML配置、注解配置、java代码配置。
主要模块:
-
Spring Core:核心类库,提供IOC服务;
-
Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等);
-
Spring AOP:AOP服务;
-
Spring DAO:对JDBC的抽象,简化了数据访问异常的处理;
-
Spring ORM:对现有的ORM框架的支持;
-
Spring Web:提供了基本的面向Web的综合特性,例如多文件上传;
-
Spring MVC:提供面向Web应用的Model-View-Controller实现。
2.Spring框架的优势
-
Spring属于低侵入式设计,代码的污染极低;
-
Spring的DI(依赖注入)机制将对象之间的依赖关系交由框架处理,减低组件的耦合性;
-
Spring提供了AOP技术,支持将一些通用任务,如安全、事务、日志、权限等进行集中式处理,从而提供更好的复用;
-
Spring生态不错,对主流的应用框架基本都提供了集成支持。
3.IOC和DI是什么?
- IOC容器
IOC就是控制反转,是指将创建对象的控制权转移到Spring容器中,并由容器根据配置文件去创建实例和管理各个实例之间的依赖关系,对象与对象之间松耦合,也利于功能的复用。
- DI依赖
DI依赖注入,和控制反转是同一个概念的不用角度的描述,即应用程序在运行时依赖IOC容器来动态注入对象需要的外部资源。
4.描述下Spring IOC容器的初始化过程
5.BeanFactory和FactoryBean的区别?
BeanFactory是用于管理Bean的工厂类,而FactoryBean是用来扩展的,它的实现与设计模式中的工厂模式和修饰器模式类似,用户可以通过实现指定接口定制化Bean的逻辑。
6.BeanFactory和ApplicationContext的异同?
BeanFactory和ApplicationContext是spring的两大核心接口,都可以当做Spring的容器,其中ApplicationContext是BeanFactory的子接口。
-
BeanFactory采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean是(调用getBean()),才对该Bean进行加载实例化。
-
ApplicationContext是在容器启动容器时,一次性创建了所有的Bean。这样可以在初始化容器时,就可以发现Spring中存在的配置错误。
-
由于初始化方式的不同,所以ApplicationContext唯一的不足就是占用内存空间,当配置的Bean较多时,程序启动较慢。
7.Spring Bean的生命周期?
-
实例化Bean
-
设置对象属性(依赖注入)
-
处理Aware接口
-
自定义处理Bean(BeanPostProcessor)
-
调用配置的初始化方法(InitializingBean和init-method)
-
如果有第四步,那么就会实现postProcessAfterInitialization方法,这个方法是在Bean初始化结束时用的,所以可以被应用于内存或缓存技术。
-
清理Bean,如果Bean实现了DisposableBean这个接口,那么就会调用其实现方法destroy()方法
-
如果Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。
8.Spring AOP的实现原理?
AOP代理主要分为静态代理(AspectJ)和动态代理
Spring AOP中的动态代理主要有两种,JDK原生的动态代理和CGLIB动态代理
9.Spring是如何管理事务的?
Spring事务的本质其实就是数据库对事务的支持,没有数据库的支持,spring是无法提供事务功能的。真正的数据层的事务提交和回滚是通过binlog和redo log实现的,Spring支持编程式事务和声明式事务
-
编程式事务管理使用TransactionTemplate
-
声明式事务管理建立在AOP之上的。其本质是通过AOP功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,也就是目标方法开始之间加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
10.Spring的不同事物传播行为有哪些,干什么用的?
Spring事务的传播行为就是说,当多个事务同时存在时,spring如何处理这些事务的行为。
可以通过子父事务状态来记忆
父类 | 子类 |
---|---|
有事务 | 合并、重新创建、挂起、抛异常、嵌套事务 |
无事务 | 重新创建、抛异常 |
11.Spring中运动到了哪些设计模式?
-
工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例。
-
单例模式:Bean默认为单例。
-
代理模式:Spring的AOP功能用到了JDK的动态代理和CGlib字节码生成技术。
-
模板模式:用来解决代码重复问题,比如RestTemplate、JmsTemplate等。
-
观察者模式:Spring的事件驱动就是观察者模式(监听器)。
12.Spring如何解决循环依赖?
-
构造器参数循环依赖:无法解决,只能通过抛出BeanCurrentlyIn CreationExcepiont异常表示循环依赖。
-
setter方式单例,默认方式
-
setter方式原型,prototype
13.Bean的作用域
-
singleton:默认,单例,没此初始化只加载一次,并进行缓存使用
-
prototype:不进行缓存,每次使用都会创建,适用于带有状态的Bean
下边这几个都是Web的创建方式
-
request:每次网络请求创建一个实例,请求完成之后,回收
-
session:与request范围类似,每个session中有一个bean实例,在session过期后,bean失效
-
global-session:全局作用域,与Servlet中session作用域效果相同
14.Spring框架中有哪些不同类型的事件?
Spring的ApplicationContext 提供了支持事件和代码中监听器的功能。 我们可以创建bean用来监听在ApplicationContext 中发布的事件ApplicationEvent类和在ApplicationContext接口中处理的事件,如果一个bean实现了ApplicationListener接口,当一个ApplicationEvent 被发布以后,bean会自动被通知.
Spring 提供了以下5中标准的事件:
-
上下文更新事件(ContextRefreshedEvent):该事件会在ApplicationContext被初始化或者更新时发布。也可以在调用ConfigurableApplicationContext 接口中的refresh()方法时被触发。
-
-
上下文停止事件(ContextStoppedEvent):当容器调用ConfigurableApplicationContext的Stop()方法停止容器时触发该事件。
-
上下文关闭事件(ContextClosedEvent):当ApplicationContext被关闭时触发该事件。容器被关闭时,其管理的所有单例Bean都被销毁。
-
请求处理事件(RequestHandledEvent):在Web应用中,当一个http请求(request)结束触发该事件。
15.Spring通知有哪些类型?
-
前置通知(Before advice):在某节点(join point)之前执行的通知,但这个通知不能阻止连接点前的执行(除非抛出一个异常);
-
返回后通知(After returning advice):在某连接点(join point)正常完成后执行的通知,如:一个方法没有抛出异常,正常返回。
-
抛出异常后通知(After throwing advice):在方法抛出异常退出时执行的通知。
-
后通知(After advice):当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)
-
环绕通知(Around Advice):包围一个连接点(join point)的通知,如方法调用。这是最强大的一种通知类型。环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回他们自己的返回值或者抛出异常类结束执行。环绕通知是最常用的一种通知类型。大部分基于拦截的AOP框架,例如Nanning和JBoss4,都只提供环绕通知。
16.Spring的自动装配
-
no:默认的方式是不进行自动装配,通过手动配置ref属性来进行装配bean
-
byName:通过bean的名称进行自动装配,如果一个bean的property与另一个bean的name相同,就进行自动装配。
-
byType:通过参数的数据类型进行自动装配
-
constructor:利用构造函数进行装配,并且构造函数的参数通过byType进行装配。
-
autodetect:使用注解的方式进行注入,先通过构造函数进行装配,否则用byType进行装配