Spring常考的面试题

  1. 说说Spring的控制反转(IOC)?

    IOC也叫控制反转,将对象间的依赖关系交给Spring容器。使用配置文件来创建所依赖的对象,由主动创建改为被动方式,实现解耦合。

  2. Spring的AOP面向切面编程?

    AOP,面向切面编程是指当需要在某个方法之前或者之后做一些额外的操作,比如书日志记录、权限判断、异常统计。可以利用AOP将功能代码从业务逻辑代码中分离出来。

  3. Spring中的AOP主要有两种实现方式?

    • 使用JDK动态代理实现,使用java.lang.reflection.Proxy类来处理;
    • 使用cglib来实现
  4. Spring如何选择这两种代理方式?

    • 如果目标对象实现了接口,默认情况会采用JDK的动态代理实现AOP,也可以强制使用cglib实现AOP
    • 如果目标对象没有实现接口,必须采用cglib,Spring会自动在JDK动态代理和cglib之间转换。
  5. IOC容器的初始化过程?

    • IOC容器的初始化主要包括Resource定位、载入和注册三个步骤。
  6. BeanFactory和FactoryBean的区别?

    • BeanFactory:Bean工厂,是一个工厂,是Spring IOC容器的最顶层接口,它的作用是管理Bean.
    • FactoryBean:工厂Bean,是一个Bean,作用是产生其他Bean实例,需要提供一个工厂方法,该方法用来返回其他Bean实例;
  7. BeanFactory和ApplicationContext的区别?

    • BeanFactory是Spring里面最顶层的接口,包括了各种Bean的定义,读取Bean配置文件,管理Bean的加载、实例化、控制Bean的生命周期,维持Bean之间的依赖关系。
    • ApplicationContext接口是BeanFacoty的派生,除了提供BeanFactory所具有的功能外,还提供了更完整的框架功能。
      • 继承MessageSource,支持国际化;
      • 提供了统一的资源文件访问方式;
      • 提供了Listener中注册Bean的事件;
      • 提供同时加载多个配置文件的功能;
      • 载入多个(继承)上下文,使得每一个上下文都专注于一个特定的层次,比如应用的Web层
  8. BeanFactory和ApplicationContext的优缺点?

    • BeanFactory
      • 优点:应用启动的时候占用资源很少,对资源要求较高的应用,比较有优势
      • 缺点:运行速度相对会慢一些,有可能会出现空指针异常的错误,而且通过Bean工厂创建的Bean生命周期会简单一些
    • ApplicationContext
      • 优点:所有的Bean在启动的时候都进行了加载,系统运行的速度很快,在系统启动的时候,可以发现系统中的配置错误
      • 缺点:把费时的操作放到系统启动中完成,所有的对象都可以预加载,内存占用较大
  9. Spring中Bean的作用域有哪几种?

    • Singleton:Bean在每个Spring IOC容器中只有一个实例,默认作用域

    • Prototype:一个Bean在定义的时候可以有多个实例

    • request:每次http请求都会创建一个Bean,该作用域仅在基于Web的Spring ApplicationContext情形下有效

    • Session:在一个Http Session中,一个Bean定义对应一个实例,该作用域仅在基于Web的Spring ApplicationContext情形下有效。

    • Global-Session:在一个全局的Http Session中,一个Bean对应一个实例,该作用域仅在基于Web的Spring ApplicationContext情形下有效。

      单例Bean是线程安全的嘛?

      单例Bean和线程安全与否没有必然的关,在一般情况下,只有无状态的Bean才可以在多线程下共享

  10. Spring的事务?

    • 编程式事务管理:使用TransactionTemplate实现

    • 声明式事务管理:建立在AOP之上的,其本质就是通过AOP功能,对其方法进行拦截,将事务处理的功能编织到拦截的方法中。

      声明式事务管理要优于编程式事务管理,这正是Spring倡导的非侵入式的开发方式,使业务代码不受污染,只要加上注解就可以获得完全的事务支持。唯一不足之处是声明式事务的最细粒度只能作用到方法级别,无法像编程式事务做到代码块级别

  11. Spring中都实现了哪些设计模式?

    • 工厂设计模式:Spring使用工厂模式,通过BeanFactory、ApplicationContext创建Bean对象;
    • 代理设计模式:Spring AOP功能的实现
    • 单例设计模式:Spring中的Bean默认都是单例的
    • 模板方法模式:Spring中的jdbcTemplate、hibernateTemplate等以Template结尾的对数据库操作的类,它们就使用到模板模式。
    • 包装器设计模式:项目中需要连接不同的数据源。这种模式可以根据用户的需求能够动态切换不同的数据源。
    • 适配器模式:Spring AOP的增强或通知(Advice)使用到了适配器模式。Spring mvc也是使用了适配器模式适配Controller。
  12. Spring MVC消息处理流程?

    Spring MVC是一种轻量级的Web层框架,是一个基于请求驱动的Web框架,使用了前端控制器(DIspatcherServlet)模型来进行设计,再根据请求映射规则分发给相应的页面控制器进行处理。具体请求流程:通过前端控制器DispatcherServlet来接收并且分发请求,然后通过HandleMapping和HandlerAdapter找到具体可以处理该请求的Handler,经过逻辑处理,返回一个ModellAndView,经过ViewResolver处理,最后生成一个View视图返回给了客户端。

    一图胜千言

    Spring常考的面试题

  13. MyBatisDao接口的工作原理?

    Mapper接口的工作原理是JDK动态代理,MyBatis运行时会使用JDK动态代理为Mapper接口生成代理对象Proxy,代理对象会拦截接口方法,转而执行MapperStatement所代表的SQL,然后将SQL执行结果返回。

  14. MyBatis的核心组件有哪些?

    • SqlSessionFactoryBean
    • SqlSessionFactory
    • SqlSession
    • Mapper
  15. MyBatis中#和$的区别?

    MyBatis中能用#号的地方尽量不要使用$,区别如下:

    1、#符号将传入的数据都当做一个字符串,会对自动传入的数据加上一个双引号

    2、$符号将传入的数据直接显示在生成的SQL语句上

    3、#符号存在预编译的过程,对问号赋值,防止SQL注入

    4、$是一种直译的方式,一般用在order by ${列名}语句中

  16. MyBatis的缓存机制?

    • 一级缓存(同一个SqlSession):基于HashMap的本地缓存,其存储作用域为Session,当Session Flush或close之后,该Session中的所有缓存都将清空,默认打开一级缓存。
    • 二级缓存(同一个SqlSessionFactory):默认也是采用HashMap的本地缓存,不同在于存储作用域为Mapper(NameSpace),并且可以自定义存储源。
上一篇:spring源码分析(二)


下一篇:Spring原理解析-BeanFactory---容器加载过程解析