其他分享
首页 > 其他分享> > 面试必问———————Spring

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

作者:互联网

  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