spring面试题精选

一、Spring特点、好处

  1. 轻量

  2. 控制反转

  3. 面向切面

  4. 容器

  5. MVC框架

  6. 事务管理

  7. 异常处理

二、Spring IOC

  1. 概念

   Spring通过一个配置文件描述Bean与Bean之间的依赖关系,利用Java语言的反射功能是实现实例化Bean,并建立Bean之间的依赖关系。Spring的IOC容器在完成这些底层工作的基础上,还提供了Bean实例缓存、生命周期管理、Bean实例代理等功能。

  2. Bean作用域

    ① singleton: 单例模式,Spring IoC 容器中只会存在一个共享的 Bean 实例

    ② prototype: 每次通过 Spring 容器获取 prototype 定义的 bean 时,容器都将创建一个新的 Bean 实例

    ③ Request: 在一次 Http 请求中,容器会返回该 Bean 的同一实例。

    ④ Session: 在一次 Http Session 中,容器会返回该 Bean 的同一实例。

    ⑤ global: 在一个全局的 Http Session 中,容器会返回该 Bean 的同一个实例

     3. Bean生命周期

  ① 实例化
  实例化一个 Bean,也就是我们常说的 new。
 
  ②IOC 依赖注入
  按照 Spring 上下文对实例化的 Bean 进行配置,也就是 IOC 注入。
 
  ③setBeanName 实现
  如果这个 Bean 已经实现了 BeanNameAware 接口,会调用它实现的 setBeanName(String)方法,此处传递的就是 Spring 配置文件中 Bean 的 id 值
 
  ④BeanFactoryAware 实现
  如果这个 Bean 已经实现了 BeanFactoryAware 接口,会调用它实现的 setBeanFactory,setBeanFactory(BeanFactory)传递的是 Spring 工厂自身(可以用这个方式来获取其它 Bean,只需在 Spring 配置文件中配置一个普通的 Bean 就可以)。13/04/2018 Page 125 of 283
 
  ⑤ApplicationContextAware 实现
  如果这个 Bean 已经实现了 ApplicationContextAware 接口,会调用setApplicationContext(ApplicationContext)方法,传入 Spring 上下文(同样这个方式也可以实现步骤 4 的内容,但比 4 更好,因为 ApplicationContext 是 BeanFactory 的子接口,有更多的实现方法)
 
  ⑥postProcessBeforeInitialization 接口实现-初始化预处理
  如果这个 Bean 关联了 BeanPostProcessor 接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor 经常被用作是 Bean 内容的更改,并且由于这个是在 Bean 初始化结束时调用那个的方法,也可以被应用于内存或缓存技术。
 
  ⑦init-method
  如果 Bean 在 Spring 配置文件中配置了 init-method 属性会自动调用其配置的初始化方法。
  ⑧postProcessAfterInitialization
  如果这个 Bean 关联了 BeanPostProcessor 接口,将会调用postProcessAfterInitialization(Object obj, String s)方法。
  注:以上工作完成以后就可以应用这个 Bean 了,那这个 Bean 是一个 Singleton 的,所以一般情况下我们调用同一个 id 的 Bean 会是在内容地址相同的实例,当然在 Spring 配置文件也可以配置非 Singleton。
  ⑨Destroy 过期自动清理阶段
  当 Bean 不再需要时,会经过清理阶段,如果 Bean 实现了 DisposableBean 这个接口,会调用那个其实现的
 
  ⑩ destroy()方法;
destroy-method 自配置清理
  最后,如果这个 Bean 的 Spring 配置中配置了 destroy-method 属性,会自动调用其配置的销毁方法。

  4.  依赖注入四种方式:构造器注入、setter注入、静态工厂注入、实例工厂注入

  5. 自动装配方式:

    ①no:默认的方式是不进行自动装配,通过显式设置 ref 属性来进行装配。

  ②byName:通过参数名 自动装配,Spring 容器在配置文件中发现 bean 的 autowire 属性被设

置成 byname,之后容器试图匹配、装配和该 bean 的属性具有相同名字的 bean

  ③byType:通过参数类型自动装配,Spring 容器在配置文件中发现 bean 的 autowire 属性被

设置成 byType,之后容器试图匹配、装配和该 bean 的属性具有相同类型的 bean。如果有多
个 bean 符合条件,则抛出错误。

  ④constructor:这个方式类似于 byType, 但是要提供给构造器参数,如果没有确定的带参数

的构造器参数类型,将会抛出异常

  ⑤autodetect:首先尝试使用 constructor 来自动装配,如果无法工作,则使用 byType 方式。

三、Spring AOP

  1. 概念

  面向切面编程,"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。

  使用"横切"技术,AOP 把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事物。AOP 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。

  2. 核心概念

  ① 切面(aspect):类是对物体特征的抽象,切面就是对横切关注点的抽象
  ② 横切关注点:对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点。
  ③ 连接点(joinpoint):被拦截到的点,因为 Spring 只支持方法类型的连接点,所以在 Spring
  中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器。
  ④ 切入点(pointcut):对连接点进行拦截的定义
  ⑤ 通知(advice):所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、
异常、最终、环绕通知五类。
  ⑥ 目标对象:代理的目标对象
  ⑦ 织入(weave):将切面应用到目标对象并导致代理对象创建的过程13/04/2018 Page 130 of 283
  ⑧ 引入(introduction):在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段。
 
  ① JDK代理
  ② Cglib代理
 
四、SpringMVC流程
  • 一个请求匹配前端控制器 DispatcherServlet(前端控制器) 的请求映射路径(在 web.xml中指定), WEB 容器将该请求转交给 DispatcherServlet 处理

  • DispatcherServlet 接收到请求后, 将根据 请求信息 交给 处理器映射器 (HandlerMapping)

  • HandlerMapping(处理器映射器) 根据用户的url请求 查找匹配该url的 Handler(处理器),并返回一个执行链

  • DispatcherServlet 再请求 HandlerAdapter(处理器适配器) 调用相应的 Handler 进行处理并返回 ModelAndView 给 DispatcherServlet

  • DispatcherServlet 将 ModelAndView 请求 ViewReslover(视图解析器)解析,返回具体 View

  • DispatcherServlet 对 View 进行渲染视图(即将模型数据填充至视图中)

  • DispatcherServlet 将页面响应给用户

猜你喜欢

转载自www.cnblogs.com/qmillet/p/12523792.html