Spring 面试知识点
1. Spring 特点
Spring 主要有如下特点:
- 轻量级:Spring 是非侵入式,其中的对象不依赖 Spring 的特定类;
- 控制反转(IoC):通过 IoC,促进了低耦合,一个对象依赖的其他对象通过被动的方式传递进来,而不用该对象主动创建或查找;
- 面向切面(AOP):支持面向切面编程,将应用业务逻辑层和系统服务层分开;
- 容器:包含并管理应用对象的配置以及生命周期,此时 Spring 就相当于一个容器;
- 框架集合:能将简单的组件进行配置,组合成为更为复杂的应用;在 Spring 中,应用对象被声明式地组合在一个 XML 文件中;此外,Spring 也提供了事务管理、 持久化框架集成等基础功能,将应用逻辑的开发留给开发者;
2. Spring 核心组件
Spring 是一个分层架构,主要由如下 7 大模块所构成。Spring 模块位于核心容器,定义了创建、配置和管理 Bean 的方式。
- Spring Core:提供 Spring 框架基本功能,主要组件是 BeanFactory,是工厂模式的实现,通过 IOC 机制将应用程序的配置和依赖性规范与实际的应用程序代码分开。
- Spring Context:一个配置文件,给 Spring 框架提供上下文信息,上下文包括 JNDI、EJB、电子邮件、国际化、校验和调度等企业服务。
- Spring AOP :通过配置管理特性,Spring AOP 直接将 AOP(面向切面)功能集成到 Spring 框架。从而我们能够十分方便的使用 Spring 框架来管理任何支持 AOP 的对象。模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用该组件,可以不依赖其他组件九江声明性事务管理集成到应用程序中。
- Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可以用来管理异常处理和不同数据库供应商抛出的错误信息。异常层次结构简化了错误处理,而且极大降低了需要编写的异常代码数量。Spring DAO 面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
- Spring ORM:Spring 框架中插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map,这些都遵从 Spring 的通用事务和 DAO 异常层次结构;
- Spring Web:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文,所以 Spring 框架支持与 Jakarta Structs 的集成。同时该模块还简化了处理多部分请求以及请求参数绑定到域对象的工作。
- Spring MVC:MVC 是一个全功能的构建 Web 应用的 MVC 实现,可以通过策略接口对 MVC 框架实现高度可配置。而且 MVC 还容纳了 JSP、Velocity、Tiles 等视图技术。
3. Spring 常用注解
注解 | 说明 |
---|---|
@Controller |
1. 用于标注控制层组件 2. 用于标记一个类,表示它是一个 SpringMVC Controller 对象 3. 分发处理器将扫描使用了该注解的类的方法,同时检测方法是否使用 @RequestMapping 4. 能够将 Request 请求 header 部分的值绑定到方法的参数上 |
@RestController |
相当于 @Component 与 @ResponseBody 的组合 |
@Component |
泛指组件,当组件不好归类时进行注解 |
@Repository |
用于注解 DAO 层,在 DaoImpl 类中注解 |
@Service |
用于注解业务层组件 |
@ResponseBody |
1. 异步请求 2. 用于将 Controller 的方法返回的对象,通过适当的 HttpMessageConverter 转换为指定格式后,写入到 Response 对象的 body 数据区3. 返回的数据并非 html 的页面,而是其他某种格式的数据(json、xml)时使用 |
@RequestMapping |
用于处理请求地址映射的注解,用于类或方法,用于类时,表示类中所有响应请求的方法都以该地址作为父路径 |
@Autowired |
对类成员变量、方法以及构造函数进行标注,从而完成自动装配,通过 @Autowired 的使用来消除 get、set 方法 |
@PathVariable |
用于将请求 URL 中的模板变量映射到功能处理方法的参数上,即取出 URL 模板中的变量作为参数 |
@RequestParam |
用于在 Spring MVC 后台控制层获取参数,类似 request.getParameter("name") |
@RequestHeader |
将 Request 请求 header 部分的值绑定到方法的参数上 |
@ModelAttribute |
在该 Controller 所有方法在调用前,先执行该注解,可用于注解和方法参数中 |
@SessionAttributes |
将值放到 session 作用域,写在 Class 上面 |
@Valid |
实体数据校验,结合 Hibernate Validator 一起使用 |
@CookieValue |
获取 cookie 中的值 |
4. IoC 原理
4.1 定义
Spring 通过一个配置文件来描述 Bean
之间的相互依赖关系,利用 Java 的反射功能来实例化 Bean
并建立 Bean
之间的依赖关系。Spring 的 IoC 容器在完成这些底层工作的基础上,还提供 Bean
实例缓存、生命周期管理、Bean
实例代理、事件发布、资源装载等高级服务;
总结而言:IOC 负责创建对象、管理对象(通过依赖注入)、整合对象、配置对象以及管理对象的生命周期;
4.2 Spring 容器高层视图
- Spring 启动时先读取
Bean
配置信息,并在 Spring 容器中生成一份对应的Bean
配置注册表; - 根据上一步中生成的
Bean
配置注册表来实例化Bean
,并装配好Bean
之间的依赖关系; - 将实例化后的
Bean
装载到 Spring 容器中的Bean
缓存池中,供上层的应用程序使用;
4.3 Spring Bean 的作用域及生命周期
4.3.1 作用域
Spring 中,用来组成应用程序的主体以及由 Spring IoC 容器所管理的对象叫做 Bean。简而言之,Bean 就是由 IoC 容器来进行初始化、装配和管理的对象。
Bean 的作用域主要有如下几种:
- Singleton(单例)
作用域为 Singleton
,该模式在多线程下不安全,表明 IoC 容器中只会存在一个共享 Bean 实例,而且所有对 Bean 的请求,主要 id
和该 Bean 定义相匹配,那么就会返回 Bean 的同一实例。Singleton
是单例模型,即在从创建容器的同时就会自动创建一个 Bean 的对象,无论是否使用,而且 每次获取到的对象都是同一对象。
- Prototype(原型):每次创建时使用
作用域为 Prototype
,表明一个 Bean 定义对应多个实例,该作用域中的 Bean 会导致在 每次对该 Bean 请求时均创建一个新的 Bean 实例。Prototype
是一个原型类型,在我们创建容器时并未实例化,而是当我们获取 Bean 时才去创建一个对象,而且每次获取到的对象都不一样。
- Request:一次 request 一个实例
作用域为