spring面试题总结

1.什么是spring IOC容器
spring框架的核心是spring IOC容器。容器创建bean对象,把它们装配在一起,配置它们并管理它们的完整生命周期
1)spring容器使用依赖注入来管理组成应用程序的bean对象
2)容器通过读取提供的配置元数据bean definition来接收对象进行实例化,配置和组装的指令。
3)该配置元数据bean definition可以通过xml、java注解或java config代码提供

2.列举IOC的一些好处?
1)它将最小化应用程序中的代码量
2)它以最小的影响和最少的侵入机制促进松耦合
3)它支持即时的实例化和延迟加载bean对象
4)它将使应用程序易于测试,因为它不需要单元测试中的任何单例或JNDI查找机制

3.什么是依赖注入(DI)?
在依赖注入中,你不必主动、手动创建对象,但必须描述如何创建它们。
1)你不是直接在代码中将组件和服务连接在一起,而是描述配置文件中哪些组件需要哪些服务
2)然后,再由IOC容器将它们装配在一起

4.IOC与DI有什么区别?
IOC是个更宽泛的概念,DI是更具体的。
关系:依赖注入不能单独存在,需要在IOC基础上完成操作

5.可以通过多少种方式完成依赖注入?
通常,依赖注入可以通过三种方式完成,即:
1)接口注入
2)构造函数注入
3)setter注入
目前,在spring框架中,仅适用构造函数注入和setter注入这两种方式

6.spring中有多少种IOC容器?
Spring提供了两种IOC容器,分别是BeanFactory、ApplicationContext
另外,BeanFactory也被称为低级容器,而ApplicationContext被称为高级容器。
BeanFactory最常用的是XmlBeanFactory。它可以根据XML文件中定义的内容,创建相应的Bean。
常用的三种ApplicationContext容器
1)ClassPathXmlApplicationContext:从classpath的XML文件中读取上下文,并生成上下文定义,应用程序上下文从程序环境变量中取得。
2)FileSystemXmlApplicationContext:由文件系统中的xml配置文件中读取上下文。
3)XmlWebApplicationContext:由web应用的xml文件读取上下文。当然,目前我们更多的是使用springboot为主,所以使用的是第四种ApplicationContext容器,ConfigServletWebServerApplicationContext

7.spring有哪些配置方式?
单纯从spring提供的方式,一共有三种:
1)XML配置文件
2)注解配置
3)java config配置

8.spring支持几种Bean Scope
Spring Bean支持五种Scope,分别如下:
1)Singleton – 每个spring IOC容器仅有一个单bean实例。默认
2)Prototype – 每次请求都会产生一个新的实例
3)Request – 每一次http请求都会产生一个新的bean实例,并且该bean仅在当前http请求内有效
4)Session – 每一个的session都会产生一个新的bean实例,同时该bean仅在当前http session内有效。
5)Application – 每一个web application都会产生一个新的bean,同时该bean仅在当前Web Application内有效。

9.springbean容器的生命周期流程如下:
1)spring容器根据配置中的bean定义实例化bean
2)spring使用依赖注入填充所有属性,如bean中定义的配置
3)如果bean实现BeanNameAware接口,则工厂通过传递bean的ID来调用setBeanName()。
4)如果bean实现BeanFactoryAware接口,工厂通过传递自身的实例来调用setBeanFactory
5)如果存在与bean关联的任何BeanPostProcessors,则调用preProcessBeforeInitialization()方法。
6)如果为bean指定了init方法(的init-method属性),那么将调用它。
7)最后,如果存在与bean关联的任何BeanPostProcessors,则将调用postProcessAfterInitialization()方法。
8)如果bean实现DisposableBean接口,当spring容器关闭时,会调用destroy()
9)如果为bean指定了destroy方法(的destroy-method属性),那么将调用它。

10.列举spring支持的事务管理类型
目前spring提供两种类型的事务管理
1)声明式事务:通过使用注解或基于xml的配置事务,从而事务管理与业务代码分离
2)编程式事务:通过编码的方式实现事务管理,需要在代码中显式的调用事务的获得、提交、回滚。
实际场景下,我们一般使用springboot + 注解的声明式事务

11.为什么在spring事务中不能切换数据源?
因为,在spring的事务管理中,所使用的数据库连接会和当前线程绑定,即使我们设置了另外一个数据源,使用的还是当前的数据源连接。
另外,多个数据源且需要事务的场景,本身会带来多事务一致性的问题,暂时没有特别好的解决方案。

12.什么是事务的传播级别?分别哪些传播级别?
事务的传播行为,指的是当前带有事务配置的方法,需要怎么处理事务。
在TransactionDefinition接口中,定义了三类七种传播级别:
1.支持当前的事务
1)PROPAGATION_REQUIRED:支持当前事务,如果不存在就新建一个(默认)
2)PROPAGATION_SUPPORTS:支持当前事务,当前不存在,就不使用事务
3)PROPAGATION_MANDATORY:支持当前事务,如果不存在,就抛出异常
2.不支持当前事务
1)PROPAGATION_REQUIRED_NEW:如果有事务存在,挂起当前事务,创建一个新的事务
2)PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果有事务存在,挂起当前事务
3)PROPAGATION_NEVER:以非事务方式运行,如果有事务存在,抛出异常
3.其他情况
PROPAGATION_NESTED:如果当前事务存在,则嵌套事务执行

13.什么是AOP?
AOP,即面向切面编程,它与OOP(面向对象编程)相辅相成,提供了与OOP不同的抽象软件结构的视角。在OOP中,以类(Class)作为基本单元。在AOP中。以切面(Aspect)作为基本单元。

14.什么是Aspect?
Aspect由PointCut和Advice组成。可以简单地认为,使用@Aspect注解的类就是切面
 它既包含了横切逻辑的含义,也包括了连接点的含义。
 Spring AOP就是负责实施切面的框架,它将切面所定义的横切逻辑编织到切面所指定的连接点中。

AOP的工作重心在于如何将增强编织目标对象的连接点上,这里包含两个工作:
1)如果通过PointCut和Advice定位到特定的JoinPoint上。
2)如何在Advice中编写切面代码。

15.什么是JoinPoint?
JoinPoint,切点,程序运行中的一些时间点,例如:
1)一个方法的执行
2)或者是一个异常的处理
在spring AOP中,JoinPoint总是方法的执行点

16.什么是PointCut?
PointCut,匹配JoinPoint的谓词。
简单来说,PointCut是匹配JoinPoint的条件。
1)Advice是和特定的PointCut关联的,并且在PointCut相匹配的JoinPoint中执行。即Advice -> PointCut  JoinPoint
2)在spring中,所以的方法都可以认为是JoinPoint,但是我们并不希望在所有的方法上都添加Advice。而PointCut的作用,就是提供一组规则来匹配JoinPoint,给满足规则的JoinPoint添加Advice。

17.关于JoinPoint和PointCut的区别
JoinPoint和PointCut本质上就是两个不同纬度上的东西。
 在springAOP中,所有的方法执行都是JoinPoint。而PointCut是一个描述信息,它修饰的是JoinPoint,通过PointCut,我们就可以确定哪些JoinPoint可以被织入Advice。
 Advice是在JoinPoint上执行的,而PointCut规定了哪些JoinPoint可以执行哪些Advice。

或者,我们再换一种说法:
1.首先,Advice通过PointCut查询需要被织入的JoinPoint。
2.然后,Advice再查询到JoinPoint上执行逻辑

17.什么是Advice?
Advice,通知。
 特定JoinPoint处的Aspect所采取的动作称为Advice。
 Spring AOP使用一个Advice作为拦截器,在JoinPoint周围维护一系列的拦截器

18.有哪些类型的Advice?
1)Before – 这些类型的Advice在JoinPoint方法之前执行,并使用@Before注解标记进行配置
2)After Returning – 这些类型的Advice在连接点方法正常执行后执行,并使用@AfterReturning注解标记进行配置
3)After Throwing – 这些类型的Advice仅在JoinPoint方法通过抛出异常退出并使用@AfterThrowing注解标记配置时执行。
4)After Finally – 这些类型的Advice在连接点方法之后执行,无论方法退出是正常还是异常返回,并使用@After注解标记进行配置。
5)Around – 这些类型的Advice在连接点之前和之后执行,并使用@Around注解标记进行配置。

19.什么是Target?
Target,织入Advice的目标对象。目标对象也被称为Advised Object。
 因为spring AOP使用运行时代理的方式来实现Aspect,因为Advised Object总是一个代理对象(Proxied Object)。
 注意,Advised Object指的不是原来的对象,而是织入Advice后所产生的代理对象
 Advice + Target Object = Advised Object = Proxy。

20.AOP有哪些实现方式?
实现AOP的技术,主要分为两大类:
1.静态代理 – 指使用AOP框架提供的命令进行编译,从而在编译阶段就可以生成AOP代理类,因此也称为编译时增强。
1)编译时编织(特殊编译器实现)
2)类加载时编织(特殊的类加载器实现)
2.动态代理 – 在运行时在内存中“临时”生产AOP动态代理类,因此也称为运行时增强,目前spring中使用了两种动态代理库:
1)JDK动态代理
JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口,JDK动态代理的核心是InvocationHandler接口和Proxy类。
2)CGLIB
如果目标类没有实现接口,那么spring AOP会选择CGLIB类动态代理目标类。当然,spring也支持配置,强制使用CGLIB动态代理。
CGLIB是一个代码生成的类库,可以在运行时动态的生成某个类的子类,主要,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。

21.spring在什么时候使用JDK动态代理,什么时候使用CGLIB呢?
如果被代理的目标对象实现了至少一个接口,则会使用JDK动态代理。所有该目标类型的实现的接口都将被代理。如果该目标对象没有实现任何接口,则创建一个CGLIB代理。

22.spring AOP与AspectJ AOP有什么区别?
1)代理方式不同
Spring AOP基于动态代理方式实现
AspectJ AOP基于静态代理方式实现
2)PointCut支持力度不同
Spring AOP仅支持方法基本的PointCut
AspectJ AOP提供了完全的AOP支持,它还支持属性级别的PointCut

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值