欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring面试相关知识点简答

程序员文章站 2022-03-10 10:36:49
Spring IOC什么是IOC?IOC(Inversion of control)即控制反转,IOC并不能算为一种技术,而是一种思想,反转即把底层类作为参数传给上层类,实现上层对下层的控制。如何实现控制反转?spring框架通过DI方式实现控制反转什么是DI?DI(Dependency Injection):为依赖注入,依赖注入的方式有四种1.Set注入2.接口注入3.注解注入4.构造器注入Spring工作流程1.spring在启动时会读取应用程序提供的bean配置...

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