当前位置: 移动技术网 > IT编程>开发语言>Java > Spring面试相关知识点简答

Spring面试相关知识点简答

2020年07月31日  | 移动技术网IT编程  | 我要评论

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网