Spring面试题

97 阅读10分钟

1.重定向和转发的区别:

  • 重定向:

    • 地址栏发生变化
    • 重定向可以访问其他站点
    • 重定向是两次请求
  • 转发:

    • 地址栏不变
    • 转发只能访问当前服务器下的资源
    • 转发是一次请求,可以使用request共享数据

2.Session和Cookie的区别:

  • Session存储数据在服务器端,Cookie在客户端
  • Session没有数据大小限制,Cookie有限制
  • Session数据安全,Cookie相对不安全

6.简单介绍Spring:

  • Spring是分层的Java SE/EE应用full-stack轻量级开源框架,是一种容器
  • 以loC(Inverse Of Control:反转控制)和AOP(Aspect Oriental Programming:面向切面编程)为内核
  • IOC的作用:将对象的创建交给Spring容器,维护了对象之间的依赖关系,降低对象之间的耦合度
  • AOP的作用:它可以对业务逻辑的各个部分进行隔离,降低耦合,提高代码的复用性

7.说一下使用Spring的优势:

  • 方便解耦,简化开发: Spring 就是一个大工厂,可以将所有对象的创建和依赖关系的维护交给 Spring 管理
  • 方便集成各种优秀框架:Spring 不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如 Struts2、Hibernate、MyBatis 等)的直接支持
  • 降低 Java EE API 的使用难度:Spring 对 Java EE 开发中非常难用的一些 API(JDBC、JavaMail、远程调用等)都提供了封装,使这些 API 应用的难度大大降低
  • 方便程序的测试:Spring 支持 JUnit4,可以通过注解方便地测试 Spring 程序
  • AOP 编程的支持:Spring 提供面向切面编程,可以方便地实现对程序进行权限拦截和运行监控等功能。
  • 声明式事务的支持:只需要通过配置就可以完成对事务的管理,而无须手动编程

8.Spring是如何简化开发的:

  • 基于POJO的轻量级和最小侵入性编程;
  • 通过依赖注入和面向接口实现松耦合
  • 基于切面和惯例进行声明式编程;
  • 通过切面和模板减少样板式代码。

11.Spring容器启动流程:

  1. 初始化Spring容器,注册内置的BeanPostProcessor接口(后置处理器)的BeanDefinition接口(描述了一个bean的实例)到容器中
  2. 将配置类的BeanDefinition注册到容器中
  3. 调用refresh()方法刷新容器

2.说说你对AOP的理解:

  • AOP的概念:AOP是一种编程思想,意为面向切面编程,是对OOP(面向对象)的补充;OOP时从上到下的过程,AOP是从左到右的过程
  • 是通过预编译方式和运行期动态代理方式实现的,
  • 不修改源代码的情况下给程序动态统一添加功能的技术,是Spring容器两大核心功能之一
  • AOP的作用:它可以对业务逻辑的各个部分进行隔离,降低耦合,提高代码的复用性
  • 它的底层是通过动态代理实现的,分为:JDK动态代理和CGlib动态代理
  • 应用场景:事务,日志管理等

3.说说你对IOC的理解:

  • IOC是一种面向对象编程的设计思想,意为控制反转,是Spring容器的两大核心功能之一、
  • 控制反转:将对象的创建交给Spring容器,维护了对象之间的依赖关系,降低对象之间的耦合度
  • 依赖注入的三种方式:1.构造器,2.setter,3.接口注入

5.说说Spring Bean的生命周期:

  • Spring Bean生命周期四大部分:1.Bean定义,2.Bean的初始化,3.Bean的调用,4.Bean的销毁

6.Spring如何实现单例?:

  • 在定义Bean的时候,指定它的取值范围scope="singleton",Spring bean 默认是单例模式。

6.实例化Bean的四种方式:

  • 无参数构造器:

    public class Bean1 {
    ​
    }
    
    <bean id="userDao" class="快速入门.factory.Bean1"></bean>
    
  • 工厂静态方法:

    public class StaticFactory {
        public static UserDao getUserDao() {
            return new UserDaoImpl();
        }
    }
    
    <bean id="userDao" class="快速入门.factory.StaticFactory" factory-method="getUserDao"></bean>
    
  • 工厂实例方法:

    public class DynamicFactory {
        public UserDao getUserDao() {
            return new UserDaoImpl();
        }
    }
    
    <bean id="factory" class="快速入门.factory.DynamicFactory"></bean>
    <bean id="userDao" factory-bean="factory" factory-method="getUserDao"/>
    
  • FactoryBean:

    public class UserDaoFactory implements FactoryBean<UserDao>{
        public UserDao getobject() throws Exception {
            return new UserDao();
        }
    }
    
    <bean id="factory" class="快速入门.factory.UserDaoFactory"></bean>
    

10.说说@Autowired和@Resource注解的区别:

  • 注解来源:@Autowired时Spring提供的注解,@Resource是JDK提供的注解
  • 注入方式:@Autowired是只能按类型注入,@Resource默认按名称注入,也支持按类型注入

11.@Component和@Bean的区别:

  • 作用对象不同:@Componment作用类,@Bean作用方法
  • 作用方法不同:@Componment是直接标注到类上声明使用。@Bean是需要和configuration注解配 合使用
  • 实现不同:@Componment是直接扫描类路径来自动侦测,@Bean是通常是在标有configuration下 定义产生bean
  • 灵活型不同:@Bean比@Componment更加灵活

17.说说BeanFactory和FactoryBean的区别:

  • BeanFactory:BeanFactory是所有的SpringBean的容器根接口,也就是IOC容器或对象工厂
  • FactoryBean:Factory只是SpringIOC容器创建Bean的一种形式

18.BeanFactory和ApplicationContext有什么区别:

  • 相同点:

    • Spring提供了两种不同的IOC 容器,一个是BeanFactory,另外一个是ApplicationContext,它们都是Java接口
    • 它们都可以用来配置XML属性,也支持属性的自动注入
    • BeanFactory 和 ApplicationContext 都提供了一种方式,使用getBean("bean name")获取bean
  • 不同点:

    • BeanFactory是StringBean的容器根接口,ApplicationContext代表应用上下文
    • BeanFactory调用getBean()方法时仅实例化bean;而ApplicationContext 在启动容器的时候实例化单例bean,不会等待调用getBean()方法时再实例化。
    • BeanFactory不支持国际化,即i18n,但ApplicationContext提供了对它的支持
    • BeanFactory 的一个核心实现是XMLBeanFactory 而ApplicationContext 的一个核心实现是ClassPathXmlApplicationContext(获取配置文件路径)

16.说说Bean的作用域,以及默认的作用域:

  • singleton:默认值,单例的
  • prototype:多例的
  • request:Web项目中,Spring创建一个Bean的对象,将对象存入到request域中
  • session:Web项目中,Spring创建一个Bean的对象,将对象存入到session域中
  • global session:Web项目中,应用Protlet环境,如果没有Protlet环境那么global Session相当于Session

7.Spring中的Bean是否安全:

  • 无状态Bean:就是有实例变量的对象,可以保存数据,线程安全
  • 有状态Bean:就是没有实例变量的对象,不能保存数据,线程不安全

6.Spring的依赖注入:

  • 接口注入(Spring4后废除),Setter方法注入,构造器注入
  • Setter方法注入:容器通过触发一个类的构造器来实现
  • 构造器注入:容器通过调用无参构造器或者无参static工厂方法Bean之后,调用该Bean的setter方法来实现

6.说一下构造器注入和set注入的区别:

构造函数注入setter注入
没有部分注入有部分注入
不会覆盖setter属性会覆盖setter属性
任意修改都会创建一个新实例任意修改不会创建一个新实例
适用设置很多属性适用于设置少量属性

7.Spring如何解决循环依赖:

  • 依赖循环:循环依赖其实就是循环引用,也就是两个或则两个以上的bean互相持有对方,最终形成闭环

  • Spring解决循环依赖的理论依据其实是基于Java的引用传递

  • Spring为了解决单例的循环依赖问题,使用了三级缓存:

    • singletonObjects:单例对象的cache
    • singletonFactories : 单例对象工厂的cache
    • earlySingletonObjects :提前曝光的单例对象的Cache

15.说说Spring事务管理:

  • 两种事务管理:1.编程式事务,2.声明式事务
  • 编程式事务:有用户自己通过代码来控制事务的处理逻辑
  • 声明式事务:十分方便,我们只需在方法上加上@Transactional注解

16.spring事务的隔离级别有哪些:

事务的隔离级别说明
读未提交( read uncommitted )不能解决任何问题
读已提交( read committed )脏读
可重复读( repeatable read )脏读,不可重复读
串行化( serializable )脏读,不可重复读,幻读
事务存在的问题说明
脏读一个事务,读取到另一个事务中没有提交的数据
不可重复读(虚读)在同一事务中,两次读取到的数据不一样
幻读一个事务操作(DML)数据表中的所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改
  • 注意:隔离级别从小到大安全性越来越大,但是效率越来越低

8.spring事务什么时候会失效 | @Transactional 不生效的场景:

  1. bean对象没有被spring容器管理
  2. 方法的访问修饰符不是public
  3. 自身调用问题
  4. 数据源没有配置事务管理器
  5. 数据库不支持事务
  6. 异常被捕获
  7. 异常类型错误或者配置错误

7.Spring事务的传播机制:

  • 多个事务方法相互调用时,事务如何在这些方法之间进行传播,spring中提供了7中不同的传播特性
  • required,supports,mandatory,requers_new,not_suported,never,nested,超时时间,是否可读
  • required:默认的传播特性,如果当前没有事务,则新建一个事务;如果当前存在事务,则加入这个事务

11.Spring框架中使用了哪些设计模式:

  • 单例模式,比如在创建bean的时候
  • 代理模式,Spring AOP
  • 工厂模式,BeanFactory,FactoryBean

1.说说你对MVC的理解:

  • MVC是一种设计模式,在这种模式下软件被分为三层,即Model( 模型 ),View( 视图 ),Controller( 控制器 )

    • Model:代表的是数据,View代表的是用户界面
    • Controller代表的是数据的处理逻辑
  • Controller是Model和View这两层的桥接

  • 软件分层的好处:降低对象之间的耦合度,便于代码的维护

  • SpringMVC框架是基于Java实现了MVC框架模式的请求驱动类型的轻量级框架

12.Springmvc的九大组件有哪些:

MVC相关组件说明
DispatcherServlet前端控制器(核心组件)负责分发所有的请求
HandlerMapping处理器映射器,解析我们SpringMVC定义的请求地址,@RequestMapping
HandlerAdapter处理器适配器,按照特定规则(HandlerAdapter要求的规则)去执行Controlle
View Resovler视图解析器
HandlerExceptionResolver处理器异常解析器,对异常的处理
RequestToViewNameTranslator视图名称翻译器,从request中获取ViewName
LocaleResolver当前环境处理器,从request中解析出Locale,根据Locale,对不同地址的用户,显示不同的信息
ThemeResolver主题解析器,更换主题
MultipartResolver文件解析器,处理上传请求
FlashMapManager参数传递管理器,用于管理FlashMap,FlashMap用于在redirect重定向中传递参数

12.介绍一下SpringMVC的执行流程:

MVC相关组件说明
DispatcherServlet前端控制器(核心组件)负责分发所有的请求
HandlerMapping处理器映射器,根据请求的url查找Handler(解析我们SpringMVC定义的请求地址)@RequestMapping
HandlerAdapter处理器适配器,按照特定规则(HandlerAdapter要求的规则)去执行Controller
Handler(controller)处理器,把逻辑视图名解析成真正的物理视图
View Resovler视图解析器
  • 流程视图:

image.png

  • 文字流程:

    1. 用户发送请求到前端控制器
    2. 前端控制器请求处理器映射器
    3. 处理器映射器解析我们定义的地址,返回给前端控制器一个条处理器执行链
    4. 前端控制器请求处理器适配器,适配器根据指定的规则调用controller
    5. controller返回ModelAndView给处理器适配器
    6. 处理器适配器返回ModelAndView给前端控制器
    7. 前端控制器把ModelAndView传给视图解析器
    8. 视图解析器解析后返回前端控制器View
    9. 前端控制器根据View渲染视图,响应给用户