spring常见面试题(问题及答案)

  1. Spring什么是控制反转
 控制反转(IoC=Inversion of Control)IoC,把对象的创建、初始化、销毁交给spring来管理,而不是由开发者控制,从而实现控制反转。本质上它是一种编程思想,实现方式通过依赖注入(DI),目的是为了降低我们业务代码中对象间的耦合性;
 
  1. Spring依赖注入方式有几种
主要有两种方式,Setter方法和Constructor来注入依赖。还有一种FactoryMethod方式,形式上和Constructor类似。

  1. Spring框架中Bean的自动装配方式有几种
byName 根据id/name
byType 根据类型
constructor 根据构造参数
no 人工指定(默认)
  1. 自动装配注解
	@Autowired默认按照类型去匹配bean,匹配不到再按照name去匹配。
	@Resource默认按照name去匹配,匹配不到再按照类型去匹配。
	@Inject是javax包下的注解,主要是为了JSR规范而实现的注入规则,主要是按照类型类匹配,如果要想按照name匹配,需要添加@Named注解来指定名称。
  1. Bean哪几种作用域
单例(singleton),也是默认选项。在整个应用中,spring只会为配置的 bean生成一个实例
原型(prototype),每次注入,或者每次从spring ioc容器中获取的时候都创建一个新的实例。
会话(session),会话过程中spring只创建一个实例
请求(request),一次请求过程中创建一个实例,不同的请求创建不同的实例。
默认使用singleton作用域
global- session:global-session和Portlet应用相关。当你的应用部署在 Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的 portlet共用全局的存储变量的话,那么这全局变量需要存储在global- session 中。
  1. spring中有多少种ioc容器?
BeanFactory:就像一个包含bean集合的工厂类。它会在客户端要求时实例化bean。
ApplicationContext:ApplicationContext接口扩展了BeanFactory接口。它在BeanFactory基础上提供了一些额外的功能,比如与Spring的
AOP更容易集成,也提供了处理message resource的机制(用于国际化)、 事件传播以及应用层的特别配置,比如针对Web应用的WebApplicationContext。
  1. 常见的ApplicationContext实现方式
 (1) ClassPathXmlApplicationContext:从 classpath 的 XML 配置文件中读取上下文,并生成上下文定义。
 ApplicationContext ctx  = new ClassPathXmlApplicationContex t("bean.xmT);
 (2) FileSystemXmlApplicationContext :由文件系统中的XML配置文件读取 上下文。
 (3) XmlWebApplicationContext:由 Web 应用的 XML 文件读取上下文。
 (4) AnnotationConfigApplicationContext(基于 Java 配置启动容器)
 Applicationcontext ctx = new AnnotationConfigApplicationContext(AppConfig.class)
  1. Spring提供了以下5中标准的事件
 (1)上下文更新事件(ContextRefreshedEvent):该事件会在 ApplicationContext
   被初始化或者更新时发布。也可以在调用ConfigurableApplicationContext 接口中的refresh。方法时被触发。
 (2)上下文开始事件(ContextStartedEvent):当容器调用   
   ConfigurableApplicationContext的Start。方法开始/重新开始容器时触发该事件。
 (3)上下文停止事件(ContextStoppedEvent):当容器调用   
   ConfigurableApplicationContext的Stop。方法停止容器时触发该事件。
 (4) 上下文关闭事件(ContextClosedEvent):当 ApplicationContext 被关闭时触   
   发该事件。容器被关闭时,其管理的所有单例Bean都被销毁。
 (5)请求处理事件(RequestHandledEvent):在Web应用中,当一个http请求 (request)结束触发该事件。
还可以通过扩展ApplicationEvent类来开发自定义的事件。
  1. Spring框架中都用到了哪些设计模式?
(1)工厂模式:Spring使用工厂模式,通过BeanFactory和ApplicationContext来创建对象
(2)单例模式:Bean默认为单例模式
(3)策略模式:例如Resource的实现类,针对不同的资源文件,实现了不同方式的资源获取策略
(4)代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术
(5)模板方法:可以将相同部分的代码放在父类中,而将不同的代码放入不同的子类中,用来解决代码重复的问题。比如RestTemplate, JmsTemplate, JpaTemplate
(6)适配器模式:Spring AOP的增强或通知(Advice)使用到了适配器模式,Spring MVC中也是用到了适配器模式适配Controller
(7)观察者模式:Spring事件驱动模型就是观察者模式的一个经典应用。
(8)桥接模式:可以根据客户的需求能够动态切换不同的数据源。比如我们的项目需要连接多个数据库,客户在每次访问中根据需要会去访问不同的数据库
  1. IOC容器对Bean的生命周期:
 - 通过构造器或工厂方法创建Bean实例
 - 为Bean的属性设置值和对其他Bean的引用
 - 将 Bean 实例传递给 Bean 前置处理器的 postProcessBeforelnitialization 方法
 - 调用Bean的初始化方法(init-method)
 - 将 Bean 实例传递给 Bean 后置处理器的 postProcessAfterInitialization 方法
 - Bean可以使用了
 - 当容器关闭时,调用Bean的销毁方法(destroy-method)

  1. 使用过Spring提供的一些扩展点么

 - 首先是生成bean定义阶段:

BeanDefinitionRegistryPostProcessor:参数是BeanDefinitionRegistry,可以在其实现的方法中声明一个bean定义,然后通
过BeanDefinitionRegistry注册到bean工厂中。(dubbo集成spring)
Import注解:可以在注解属性值中添加三种class类,一种是普通的类,bean工厂会解析此类生成bean定义,注册到bean工厂中;一种是
实现了ImportSelector接口的类,实现其中的方法返回一个String数组,spring会将返回的数组,再次解析,然后注册到bean工厂中。
一种是实现了ImportBeanDefinitionRegistrar接口的类,实现其方法,可以在方法中声明bean定义,手动注册到bean工厂中。
BeanFactoryPostProcessor:参数是ConfigurableListableBeanFactory,可以在实现的方法中,从bean工厂中获取bean定义,然
后修改其中的bean属性。

 - 实例化bean阶段:

BeanPostProcessor:其中有两个方法,postProcessBeforeInitialization和postProcessAfterInitialization,执行时机是在bean初始化方法前后,postProcessBeforeInitialization会在初始化前执行,也就是执行bean的init方法前去执行。postProcessAfterInitialization是在执行完init方法后去执行。此beanPostProcessor可以获取工厂实例化且初始化依赖后的bean,修改其中的属性,或者类似AOP那样,生成代理类。
InitializingBean:算是比较常用的扩展点,内部有afterPropertiesSet方法,执行时机是在BeanPostProcessor接口的postProcessBeforeInitialization方法前执行。
Aware接口:各种Aware接口,本质是ApplicationContextAwareProcessor这个类实现了BeanPostProcessor接口,所以执行时机同BeanPostProcessor。可以获取到各种Spring的资源对象,比如ApplicationContext等等。
  1. Spring AOP
Spring AOP(Aspect Oriented Programming,面向切面编程)是一种编程思想;
应用例如事务管理、权限、日志、安全等	 
  1. Spring AOP实现三种
 (1) AspectJ  
 (2) Spring AOP(实现方式通过JDK(默认)和CJLIB动态代理,还是运行期(对象初始化)进行织入)
 (3) JBoss AOP
  1. Spring中有哪些不同的通知类型
(1)前置通知(Before Advice): 在连接点之前执行的Advice,不过除非它抛出异常,否则没有能力中断执行流。使用@Before 注解使用这个Advice。
(2)返回之后通知(After Retuning Advice):在连接点正常结束之后执行的Advice。例如,如果一个方法没有抛出异常正常返回。通过 @AfterReturning 关注使用它。
(3)抛出(异常)后执行通知(After Throwing Advice):如果一个方法通过抛出异常来退出的话,这个Advice就会被执行。通用 @AfterThrowing 注解来使用。
(4)后置通知(After Advice): 无论连接点是通过什么方式退出的(正常返回或者抛出异常)都会执行在结束后执行这些Advice。通过@After 注解使用。
(5)围绕通知(Around Advice): 围绕连接点执行的Advice,就你一个方法调用。这是最强大的Advice。通过 @Around注解使用。
  1. AOP现有两个主要的流行框架,即Spring AOP和Spring+AspectJ关系
(1)织入的时期不同
    Spring Aop采用的动态织入(运行期织入),而Aspectj是静态织入(编译时期就织入)。所以Spring AOP属于运行时增强,AspectJ 是编译时增强;
(2)从使用对象不同
     Spring AOP的通知是基于该对象是SpringBean对象才可以,而AspectJ可以在任何Java对象上应用通知。
(3)spring aop 参考了 AspectJ编程风格
  1. Spring AOP里面的几个名词的概念
(1)连接点(Join point):指程序运行过程中所执行的方法。在Spring AOP中,一个连接点总代表一个方法的执行。 
(2)切面(Aspect):被抽取出来的公共模块,可以用来会横切多个对象。Aspect切面可以看成 Pointcut切点 和 Advice通知 的结合,一个切面可以由多个切点和通知组成。
(3)切点(Pointcut):切点用于定义 要对哪些Join point进行拦截。
切点分为execution方式和annotation方式。execution方式可以用路径表达式指定对哪些方法拦截。annotation方式可以指定被哪些注解修饰的代码进行拦截。
(4)通知(Advice):指要在连接点(Join Point)上执行的动作,即增强的逻辑,比如权限校验和、日志记录等。通知有各种类型,包括Around、Before、After、After returning、After throwing。
(5)目标对象(Target):包含连接点的对象,也称作被通知(Advice)的对象。 由于Spring AOP是通过动态代理实现的,所以这个对象永远是一个代理对象。
(6)织入(Weaving):通过动态代理,在目标对象(Target)的方法(即连接点Join point)中执行增强逻辑(Advice)的过程。
(7)引入(Introduction):添加额外的方法或者字段到被通知的类。Spring允许引入新的接口(以及对应的实现)到任何被代理的对象。例如,你可以使用一个引入来使bean实现 IsModified 接口,以便简化缓存机制。
  1. spring支持编程式事务管理和声明式事务管理两种方式
(1)编程式事务管理使用TransactionTemplate。最细粒度只能作用到代码块级别。
(2)声明式事务管理使用@Transactional,建立在AOP之上的。其本质是通过AOP功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前启动一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务,最细粒度只能作用到方法级别。
  1. spring的事务传播机制
(1)PROPAGATION_REQUIRED:(默认传播行为)如果当前没有事务,就创建一个新事务;如果当前存在事务,就加入该事务。
(2)PROPAGATION_REQUIRES_NEW:无论当前存不存在事务,都创建新事务进行执行。
(3)PROPAGATION_SUPPORTS:如果当前存在事务,就加入该事务;如果当前不存在事务,就以非事务执行。
(4)PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
(5)PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则按REQUIRED属性执行。
(6)PROPAGATION_MANDATORY:如果当前存在事务,就加入该事务;如果当前不存在事务,就抛出异常。
(7)PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
  1. Spring中的隔离级别
(1)ISOLATION_DEFAULT:这是个 PlatfromTransactionManager 默认的隔离级别,使用数据库默认的事务隔离级别。
(2)ISOLATION_READ_UNCOMMITTED:读未提交,允许事务在执行过程中,读取其他事务未提交的数据。
(3)ISOLATION_READ_COMMITTED:读已提交,允许事务在执行过程中,读取其他事务已经提交的数据。
(4)ISOLATION_REPEATABLE_READ:可重复读,在同一个事务内,任意时刻的查询结果都是一致的。
(5)ISOLATION_SERIALIZABLE:所有事务逐个依次执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值