Spring面试相关知识点简答
Spring IOC
- 什么是IOC?
IOC(Inversion of control)即控制反转,IOC并不能算为一种技术,而是一种思想,反转即把底层类作为参数传给上层类,实现上层对下层的控制。 - 如何实现控制反转?
spring框架通过DI方式实现控制反转 - 什么是DI?
DI(Dependency Injection):为依赖注入,依赖注入的方式有四种
1.Set注入
2.接口注入
3.注解注入
4.构造器注入
Spring工作流程
-
bean如何装载到IOC中的
1.spring在启动时会读取应用程序提供的bean配置信息,并在spring容器中生成一份相应的bean配置注册表,
2.然后根据这个注册表取实例化bean,
3.然后将bean实例放到spring容器中
4.应用程序就可以从容器中获取到bean进行使用 -
如何从IOC获取Bean实例
1.首先从 getBean() 方法开始创建过程,getBean()有一系列的重载方法,最终都是调用doGetBean() 方法。
2.先尝试判断创建的这个Bean是否单例,如果是单例,再次判断缓存中是否存在这个Bean实例,存在就直接从缓存中获取这个Bean,通过getSingleton()方法尝试从缓存中获取单例bean。
3.如果创建的这个Bean是多例,或者是单例并且在缓存中没有,这时候执行创建Bean的doCreateBean()方法。
4.执行doCreateBean()方法,并由createBeanInstance()方法创建Bean。
5.createBeanInstance()方法使用反射实例化Bean,最后执行populateBean()方法主要给 Bean 填充依懒与属性的注入 -
spring bean的作用域
singleton:Spring的默认作用域,容器里拥有唯一的bean实例
prototype:针对每个getBean请求,容器都会创建一个bean实例
request:会为每个http请求创建一个bean实例
session:会为每个session创建一个bean实例
globalSession:会为每个全局Http session创建一个bean实例,该作用域仅对portlet有效
Spring AOP
-
什么是AOP?
-
spring用什么方式实现AOP的?
使用动态代理方式,调用切面代码,增强业务功能,具体是由JDKProxy和Cglib来实现的(在DefaultAopProxyFactory类中的createAopProxy) -
具体由哪种当时生成代理类?
默认的策略是如果目标类实现了接口,则用JDK动态代理来实现,如果没有实现接口则用Cglib代理来实现
注意JDK动态代理必须要目标类要实现某一个或几个接口 -
JDKProxy怎么实现代理的?
JDK动态代理通过反射来接收被代理的类,并且要求被代理的类需要实现InvocationHandler接口和Proxy类
具体实现为:
通过java的反射机制实现的,反射机制生成类的过程中比较高效 -
Cglib怎么实现代理的?
Cglib以继承的方式动态生成目标类的代理类,因为是继承,所以如果某个类被标注为final,那么它是无法被cglib代理的,同时类中被final修饰的也无法被继承,这样可以说cglib生产的代理类是原类的增强类,cglib全称Code Generation Library,是一个代码生成的类库
具体实现为:
cglib是借助ASM实现的,ASM是一种能操作字节码的框架,ASM在生成类之后的执行过程比较高效
Spring事务
Spring事务:Transactional
1.同一个类中,一个不标注事务的方法(简称 A)调用了标注事务的方法(简称 B),事务会失败(即不会发生回滚,导致写入数据库成功)。原因是Spring的事务是通过AOP来实现的,AOP的底层是动态代理,当方法标注了@Transactional,此时Spring会帮助我们生成一个代理对象,当我们调用方法时,其实是代理对象调用的我们的方法(即A方法),但是当 A 调用 B 时,用的是this指针,有事务的 B 就变成了一个属性,因为 A 没有被事务所包裹,所以事务就不会生效。
2.不同类中,一个不标注事务的方法(简称 A)调用了标注事务的方法(简称 B),事务会成功。(即会发生回滚,不会写入数据库中)
3.在private方法上标注事务,事务会失效。因为spring内部会判断这个方法是否是public,非public会返回null,导致失败。
4.在默认回滚级别下(即rollbackFor默认级别),受检异常不会被回滚,非受检异常会回滚
非受检异常也叫运行时异常包括Error和runtimeException,其他的称为受检异常,Error问题比较严重,无需捕获,程序直接退出
本文地址:https://blog.csdn.net/m0_37679452/article/details/107604301