ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

面试必问———————Spring

2021-04-26 12:02:00  阅读:173  来源: 互联网

标签:事务 必问 PROPAGATION Spring 面试 Bean methodB ServiceB


  1. 描述集群、负载均衡、分布式

    集群

       是将一个系统部署在不同的服务器上,我们把这些部署着相同系统的不同服务器叫做集群。
    

    负载均衡

      网络的负载均衡是一种动态均衡技术,常见的实现方式是通过一些工具实时地分析数据包,掌握网络中的数据流量状况,把任务合理均衡地分配出去。
    

    分布式

    ​ 是将一个系统分为若干个子系统,每个子系统被部署在不同的服务器上,且每个子系统都可以独立运行。

  2. Nginx负载均衡的规则有哪些

    ​ 1、轮询(默认)

    ​ 2、指定权重

    ​ 3、IP绑定 ip_hash

    ​ 4、fair(第三方)

    ​ 5、url_hash(第三方)

  3. 详细描述什么是Spring?

    ​ 1、Spring的核心是一个轻量级(Lightweight)的容器(Container)。
    ​ 2、Spring是实现IoC(Inversion of Control)容器和非入侵性(No intrusive)的框架。
    ​ 3、Spring提供AOP(Aspect-oriented programming)概念的实现方式。
    ​ 4、Spring提供对持久层(Persistence)、事物(Transcation)的支持。
    ​ 5、Spring供MVC Web框架的实现,并对一些常用的企业服务API提供一致的模 型封装。
    ​ 6、Spring提供了对现存的各种框架相整合的方案。
    ​ 总之,Spring是一个全方位的应用程序框架。

  4. 什么是Spring IOC?

    ​ Sring的IOC称为控制反转,是一种设计思想,SpringIOC的底层是基于动态代理来实现的,之前开发时需要重新new一个对象出来,如今则只需要将需要创建的对象注入到Spring 的IOC容器当中,由IOC容器来为我们创建并管理注入对象的生命周期,需要对象时我们只需要只需要从IOC容器中取出即可,创建对象控制权的转移就是一种控制反转,。

  5. 什么是Spring AOP?描述其应用场景(最少2个)

    ​ Spring的AOP称为面向切面编程,AOP 有助于我们将不同但是有必要的重复性代码重构为不同的模块。这么做的好处是,我们可以将这些重复性代码集中管理起来复用,而不是每次都要重复写一遍。这种方法的好处是,代码将会变得更易于维护,从而将业务逻辑从杂乱的代码中脱离出来,专注于业务逻辑代码的开发。我们将这些不同的功能划分到不同的切面中。

    应用场景:

    ​ 集中日志记录、事务管理

  6. AOP的通知有几个,分别是什么

    ​ 五个

    ​ 前置通知,后置通知,异常通知,环绕通知,返回值通知

  7. 描述Spring Bean的作用域?

    singleton

    ​ 在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,bean作用域范围的默认值。

    prototype

    ​ 每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行newXxxBean()。

    request

    ​ 每次HTTP请求都会创建一个新的Bean,该作用域仅适用于web的Spring WebApplicationContext环境。

    session

    ​ 同一个HTTP Session共享一个Bean,不同Session使用不同的Bean。该作用域仅适用于web的Spring WebApplicationContext环境。

    application

    ​ 限定一个Bean的作用域为ServletContext的生命周期。该作用域仅适用于web的Spring WebApplicationContext环境。

  8. Spring Bean 注入有几种方式?

    ​ 1、Set()注入

    ​ 2、构造器注入

    ​ 3、静态工厂的方法注入

    ​ 4、实例工厂的方法注入

  9. SpringBean 生命周期?

    Bean的建立
    
          由BeanFactory读取Bean定义文件,并生成各个实例。
    
    Setter注入
    
          执行Bean的属性依赖注入。
    
    BeanNameAware的setBeanName()
    
          如果Bean类实现了org.springframework.beans.factory.BeanNameAware接口,则执行其setBeanName()方法。
    
    BeanFactoryAware的setBeanFactory()
    
          如果Bean类实现了org.springframework.beans.factory.BeanFactoryAware接口,则执行其setBeanFactory()方法。
    
    BeanPostProcessors的processBeforeInitialization()
    
          容器中如果有实现org.springframework.beans.factory.BeanPostProcessors接口的实例,则任何Bean在初始化之前都会执行这个实例的processBeforeInitialization()方法。
    
    InitializingBean的afterPropertiesSet()
    
          如果Bean类实现了org.springframework.beans.factory.InitializingBean接口,则执行其afterPropertiesSet()方法。
    
    Bean定义文件中定义init-method
    
          在Bean定义文件中使用“init-method”属性设定方法名称,如下:
    
    
    <bean id="demoBean" class="com.yangsq.bean.DemoBean" init-method="initMethod">
      .......
     </bean>
    
       
    
    
          这时会执行initMethod()方法,注意,这个方法是不带参数的。
    
    BeanPostProcessors的processAfterInitialization()
    
          容器中如果有实现org.springframework.beans.factory.BeanPostProcessors接口的实例,则任何Bean在初始化之前都会执行这个实例的processAfterInitialization()方法。
    
    DisposableBean的destroy()
    
          在容器关闭时,如果Bean类实现了org.springframework.beans.factory.DisposableBean接口,则执行它的destroy()方法。
    
    Bean定义文件中定义destroy-method
    
          在容器关闭时,可以在Bean定义文件中使用“destory-method”定义的方法
    
    
    <bean id="demoBean" class="com.yangsq.bean.DemoBean" destory-method="destroyMethod">
      .......
    </bean>
    
           这时会执行destroyMethod()方法,注意,这个方法是不带参数的。
    
  10. Spring框架中 用到了哪些设计模式?(不低于3个)

    (1)工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;

    (2)单例模式:Bean默认为单例模式。

    (3)代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;

    (4)模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。

  11. 描述Spring事务传播行为?

    PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
    PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。
    PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常。
    PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。
    PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
    PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。
    PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则新建一个事务。

  12. 描述Spring事务的隔离级别?

    READ_UNCOMMITTED意思是,一个事务可以读取到另一个事务未提交的事务记录。

    READ_COMMITTED隔离级别表明,一个事务只能读取到已经提交的记录

    REPEATABLE_READ意思是,一个事务可以多次从数据库读取某条记录,而且多次读取的那条记录都是一致的,

    SERIALIZABLE是Spring最强的隔离级别。事务执行时,会在所有级别上加锁,比如read和write时都会加锁,仿佛事务是以串行的方式进行的,而不是一起发生的。这会防止dirty read、non-repeatable read和phantom read的出现,但是,会带来性能的下降。

    MySQL默认是REPEATABLE_READ

  13. Spring事务传播行为 REQUIRED和REQUIRES_NEW区别

    PROPAGATION_REQUIRED
    加入当前正要执行的事务不在另外一个事务里,那么就起一个新的事务
    比如说,ServiceB.methodB的事务级别定义为PROPAGATION_REQUIRED, 那么由于执行ServiceA.methodA的时候,ServiceA.methodA已经起了事务,这时调用ServiceB.methodB,ServiceB.methodB看到自己已经运行在ServiceA.methodA
    的事务内部,就不再起新的事务。而假如ServiceA.methodA运行的时候发现自己没有在事务中,他就会为自己分配一个事务。这样,在ServiceA.methodA或者在ServiceB.methodB内的任何地方出现异常,事务都会被回滚。即使ServiceB.methodB的事务已经被提交,但是ServiceA.methodA在接下来fail要回滚,ServiceB.methodB也要回滚

    PROPAGATION_REQUIRES_NEW
    ​ 那么当执行到ServiceB.methodB的时候,ServiceA.methodA所在的事务就会挂起,ServiceB.methodB会起 一个新的事务,等待ServiceB.methodB的事务完成以后,
    ​ 他才继续执行。他与PROPAGATION_REQUIRED 的事务区别在于事务的回滚程度了。因为ServiceB.methodB 是新起一个事务,那么就是存在
    ​ 两个不同的事务。如果ServiceB.methodB已经提交,那么ServiceA.methodA失败回滚,ServiceB.methodB 是不会回滚的。如果ServiceB.methodB失败回滚,
    ​ 如果他抛出的异常被ServiceA.methodA捕获,ServiceA.methodA事务仍然可能提交。

标签:事务,必问,PROPAGATION,Spring,面试,Bean,methodB,ServiceB
来源: https://blog.csdn.net/fuNSck/article/details/116148514

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有