51、什么是 Spring IOC 容器
Spring 框架的核心是 Spring 容器。容器创建对象,将它们装配在一起,配置它 们并管理它们的完整生命周期。Spring 容器使用依赖注入来管理组成应用程序的 组件。容器通过读取提供的配置元数据来接收对象进行实例化,配置和组装的指 令。该元数据可以通过 XML,Java 注解或 Java 代码提供。
52、什么是依赖注入
在依赖注入中,您不必创建对象,但必须描述如何创建它们。您不是直接在代码 中将组件和服务连接在一起,而是描述配置文件中哪些组件需要哪些服务。由 IOC 容器将它们装配在一起。
53、在 Spring Framework 中可以通过多少种方式完成依赖注入
两种,使用构造函数和 setter 注入。
54、如何区分构造函数注入和 setter 注入
55、spring 中有多少种 IOC 容器?
BeanFactory ---- BeanFactory 就像一个包含 bean 集合的工厂类。它会在客户端 要求时实例化 bean。
ApplicationContext ---- ApplicationContext 接口扩展了 BeanFactory 接口。它 在 BeanFactory 基础上提供了一些额外的功能。
56、区分 BeanFactory 和 ApplicationContext
57、spring 支持几种 bean scope(作用域)?
Singleton - 每个 Spring IoC 容器仅有一个单实例。
Prototype - 每次请求都 会产生一个新的实例。
Request - 每一次 HTTP 请求都会产生一个新的实例,并 且该 bean 仅在当前 HTTP 请求内有效。
Session - 每一次 HTTP 请求都会产 生一个新的 bean,同时该 bean 仅在当前 HTTP session 内有效。
Global-session - 类似于标准的 HTTP Session 作用域,不过它仅仅在基于 portlet 的 web 应用中才有意义。Portlet 规范定义了全局 Session 的概念, 它被所有构成某个 portlet web 应用的各种不同的 portlet 所共享。在 global session 作用域中定义的 bean 被限定于全局 portlet Session 的生命周期范 围内。如果你在 web 中使用 global session 作用域来标识 bean,那么 web 会自动当成 session 类型来使用。
仅当用户使用支持 Web 的 ApplicationContext 时,最后三个才可用。
58、什么是 spring 的内部 bean
只有将 bean 用作另一个 bean 的属性时,才能将 bean 声明为内部 bean。
59、什么是Spring装配
当 bean 在 Spring 容器中组合在一起时,它被称为装配或 bean 装配。Spring 容器需要知道需要什么 bean 以及容器应该如何使用依赖注入来将 bean 绑定 在一起,同时装配 bean。
60、自动装配有哪些方式
Spring 容器能够自动装配 bean。也就是说,可以通过检查 BeanFactory的内容让Spring自动解析 bean 的协作者。
自动装配的不同模式:
no - 这是默认设置,表示没有自动装配。应使用显式 bean 引用进行装配。
byName - 它根据 bean 的名称注入对象依赖项。它匹配并装配其属性与 XML 文件中由相同名称定义的 bean。
byType - 它根据类型注入对象依赖项。如果属 性的类型与 XML 文件中的一个 bean 名称匹配,则匹配并装配属性。构造函数 - 它通过调用类的构造函数来注入依赖项。它有大量的参数。
autodetect - 首先 容器尝试通过构造函数使用 autowire 装配,如果不能,则尝试通过 byType 自 动装配。
61、什么是 AOP
AOP(Aspect-Oriented Programming), 即 面向切面编程。AOP 的主要作用就是在不侵入原有程序的基础上实现对原有功能的增强, 而增强的方式就是添加通知,就是额外增强一个方法。
62、什么是 Aspect
切面(Aspect)是AOP中的核心概念,它实质上是一组通知(Advice)和切点(Pointcut)的组合。通知定义了在何种情况下需要执行某些操作,而切点则确定了这些操作应该在哪里执行。通过切面,你可以在不修改原有代码的基础上,将一些公共的逻辑(比如日志记录或安全检查)注入到程序的多个部分。
63、什么是连接点(Joinpoint)
程序执行的某个特定位置(如:某个方法调用前、调用后,方法抛出异常后)。一个类或一段程序代码拥有一些具有边界性质的特定点,这些代码中的特定点就是连接点。Spring仅支持方法的连接点。
64、什么是通知(Advice)
特定 JoinPoint 处的 Aspect 所采取的动作称为 Advice。Spring AOP 使用一 个 Advice 作为拦截器,在 JoinPoint “周围”维护一系列的拦截器。
65、什么是切点(pointcut)
如果连接点相当于数据中的记录,那么切点相当于查询条件,一个切点可以匹配多个连接点。Spring AOP的规则解析引擎负责解析切点所设定的查询条件,找到对应的连接点。
66、有哪些类型的通知(Advice)
前置通知
前置通知在目标方法调用前执行,可以在前置通知中进行一些参数校验、权限检查等操作。前置通知通常是通过@Before注解来实现的。
后置通知
后置通知在目标方法调用后执行,可以在后置通知中进行一些结果处理、日志记录等操作。后置通知通常是通过@After注解来实现的。
返回通知
返回通知在目标方法返回结果后执行,可以在返回通知中进行一些结果处理、日志记录等操作。返回通知通常是通过@AfterReturning注解来实现的。
异常通知
异常通知在目标方法抛出异常后执行,可以在异常通知中进行一些异常处理、日志记录等操作。异常通知通常是通过@AfterThrowing注解来实现的。
环绕通知
环绕通知可以在目标方法执行前、执行后、返回时、抛出异常时等不同的时间点插入一些通用的代码逻辑。环绕通知通常是通过@Around注解来实现的。
正常执行的顺序是:Before -- After -- AfterThrowing -- AfterReturning
67、AOP 有哪些实现方式
静态代理
指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类, 因此也称为编译时增强;
- 编译时编织(特殊编译器实现)
- 类加载时编织(特殊的类加载器实现)。
动态代理
在运行时在内存中“临时”生成 AOP 动态代理类,因此也被称为运行时增强。
- JDK 动态代理
- CGLIB
68、Spring AOP and AspectJ AOP 有什么区别
Spring AOP 基于动态代理方式实现;AspectJ 基于静态代理方式实现。Spring AOP 仅支持方法级别的 PointCut;AspectJ提供了完全的 AOP 支持,它还支持属性级 别的 PointCut。
69、什么是编织(Weaving)
为了创建一个 advice 对象而链接一个 aspect 和其它应用类型或对象,称为编 织(Weaving)。在 Spring AOP 中,编织在运行时执行。
70、Spring MVC 框架有什么用
Spring Web MVC 框架提供 模型-视图-控制器 架构和随时可用的组件,用于开 发灵活且松散耦合的 Web 应用程序。MVC 模式有助于分离应用程序的不同方 面,如输入逻辑,业务逻辑和 UI 逻辑,同时在所有这些元素之间提供松散耦合。
71、描述一下 DispatcherServlet 的工作流程
1、向服务器发送 HTTP 请求,请求被前端控制器 DispatcherServlet 捕获。
2、 DispatcherServlet 根据 -servlet.xml 中的配置对请求的 URL 进行解 析,得到请求资源标识符(URI)。然后根据该 URI,调用 HandlerMapping 获得该 Handler 配置的所有相关的对象(包括 Handler 对象以及 Handler 对 象对应的拦截器),最后以 HandlerExecutionChain 对象的形式返回。
3、 DispatcherServlet 根据获得的 Handler,选择一个合适的 HandlerAdapter。(附注:如果成功获得 HandlerAdapter 后,此时将开始 执行拦截器的 preHandler(...)方法)。
4、提取 Request 中的模型数据,填充 Handler 入参,开始执行 Handler ( Controller)。在填充 Handler 的入参过程中,根据你的配置,Spring 将 帮你做一些额外的工作:
- HttpMessageConveter:将请求消息(如 Json、xml 等数据)转换 成一个对象,将对象转换为指定的响应信息。
- 数据转换:对请求消息进行数据转换。如 String 转换成 Integer、 Double 等。
- 数据根式化:对请求消息进行数据格式化。如将字符串转换成格式化数字 或格式化日期等。
- 数据验证:验证数据的有效性(长度、格式等),验证结果存储到 BindingResult 或 Error 中。
5、Handler(Controller)执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象;
6、根据返回的 ModelAndView,选择一个适合的 ViewResolver(必须是已 经注册到 Spring 容器中的 ViewResolver)返回给 DispatcherServlet。
7、 ViewResolver 结合 Model 和 View,来渲染视图。
8、视图负责将渲染结果返回给客户端。
72、使用 Spring 框架的好处是什么
- 轻量:Spring 是轻量的,基本的版本大约 2MB。
- 控制反转:Spring 通过控制反转实现了松散耦合,对象们给出它们的依 赖,而不是创建或查找依赖的对象们。
- 面向切面的编程(AOP):Spring 支持面向切面的编程,并且把应用业务 逻辑和系统服务分开。
- 容器:Spring 包含并管理应用中对象的生命周期和配置。
- MVC 框架:Spring 的 WEB 框架是个精心设计的框架,是 Web 框架的 一个很好的替代品。
- 事务管理:Spring 提供一个持续的事务管理接口,可以扩展到上至本地 事务下至全局事务(JTA)。
- 异常处理:Spring 提供方便的API把具体技术相关的异常(比如由JDBC, Hibernate or JDO 抛出的)转化为一致的 unchecked 异常。
73、解释 JDBC 抽象和 DAO 模块
通过使用 JDBC 抽象和 DAO 模块,保证数据库代码的简洁,并能避免数据库资源 错误关闭导致的问题,它在各种不同的数据库的错误信息之上,提供了一个统一 的异常访问层。它还利用 Spring 的 AOP 模块给 Spring 应用中的对象提供事务 管理服务。
74、解释对象/关系映射集成模块
Spring 通过提供 ORM 模块,支持我们在直接 JDBC 之上使用一个对象/关系映射 映射(ORM)工具,Spring 支持集成主流的 ORM 框架,如 Hiberate,JDO 和 iBATIS SQL Maps。Spring 的事务管理同样支持以上所有 ORM 框架及 JDBC。
75、IOC 的优点是什么
IOC 或 依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试不再需 要单例和 JNDI 查找机制。最小的代价和最小的侵入性使松散耦合得以实现。IOC 容器支持加载服务时的饿汉式初始化和懒加载。