本篇文章主要是总结在面试中会遇到的关于Spring知识点,对于重要的知识点会单独起文章进行详解。
一、什么是 Spring
Spring 是一个轻量级 Java 开发框架,最早由 Rod Johnson 创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。它是一个分层的 Full-Stack 轻量级 Java 开源框架,为开发Java应用程序提供全面的基础架构支持,让Java开发者可以专注于应用程序的开发。
1.1、设计目的
1.2、实际理念
在 JavaEE 开发中,支持 POJO 和 JavaBean 开发方式,使应用面向接口开发,充分支持 OO(面向对象)设计方法;Spring 通过 IoC 容器实现对象耦合关系的管理,并实现依赖反转,将对象之间的依赖关系交给 IoC 容器,实现解耦。
1.3、框架核心
架构核心理念是 IoC 容器和 AOP 模块。通过IoC容器管理POJO对象以及他们之间的耦合关系;通过AOP以动态非侵入的方式增强服务。
关于 IoC 详情查看这里 👉 解析 Ioc
关于 AOP 详情查看这里 👉 解析 AOP
二、Spring Bean
Spring Bean 指被 Spring IoC 容器所管理的对象。
2.1、如何成为 Spring Bean
我们可以通过三种方式让对象成为 Spring Bean ,分别是 XML 文件、注解、Java 配置类。
2.1.1、基于 XML 配置
Bean 所需的依赖项和服务在 XML 格式的配置文件中指定。这些配置文件通常包含许多 bean 定义和特定于应用程序的配置选项。它们通常 以 bean 标签开头。代码如下:
<bean id="studentbean" class="org.edureka.firstSpring.StudentBean">
<property name="name" value="Edureka"></property>
</bean>
2.1.2、基于注解配置
你可以通过在相关的类,方法或字段声明上使用注解,将 bean 配置为组件类本身,而不是使用 XML 来描述 bean 装配。默认情况下,Spring 容器中未打开注解装配。因此,您需要在使用它之前在 Spring 配置文件中启用它。代码如下:
<beans>
<context:annotation-config/>
</beans>
2.1.3、基于 Java API 配置
Spring 的 Java 配置是通过使用 @Bean
和 @Configuration
来实现。
- @Bean 注解扮演与XML配置文件中的Bean元素有相同的角色。
- @Configuration 类允许通过简单地调用同一个类中的其他 @Bean 方法来定义 bean 间依赖关系。
@Configuration
public class StudentConfig {
@Bean
public StudentBean myStudent() {
return new StudentBean();
}
}
2.2、Spring Bean 的作用域
作用域限定了 Bean 的作用范围,在定义 Bean 时,通过声明 Scope 配置项,可以灵活定义Bean的作用范围。
2.2.1、Spring Bean 包含哪些作用域
Spring Bean 作用域的配置项有五个,用于描述不同的作用域,具体如下:
- Singleton : 唯一 Bean 实例,Spring 中的 Bean 默认都是单例的,是对单例设计模式的应用。
- Prototype : 每次请求都会创建一个新的 Bean 实例。
- Request : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效。
- Session : 每一次来自新 session 的 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效。
Global-session :全局 session 作用域,仅仅在基于 portlet 的 web 应用中才有意义,Spring 5.x 之后的版本已删除该配置项。
2.2.2、Spring Bean 如何定义作用域
使用 XML 配置作用域
<bean id="..." class="..." scope="singleton"></bean>
使用
@Scope
注解配置作用域@Bean
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public Person personPrototype() {
return new Person();
}
2.3、Spring Bean 的生命周期
所谓生命周期,就是从出生到死亡的过程,了解 Spring Bean 的生命周期也就意味着我们可以更加灵活的使用 Spring 容器来为我们工作。
2.3.1、Spring Bean 生命周期的过程解析
过程非常重要,面试常客。下文涉及到的 post 翻译为委派是比较通顺的。
Spring Bean 的生命周期包含【实例化】【属性赋值】【初始化】【销毁】四个阶段同时在四个阶段之间又穿插了一些拓展内容,结合下图我们详细解析一下这四个阶段以及相应的拓展内容。
- 步骤一:Spring 容器根据配置中的 Bean 定义通过反射实例化 Bean。该步骤属于【实例化】阶段。
- 步骤二:为需要依赖注入的属性进行赋值。例如 Controller 依赖 Service,在初始化 Controller 时会在这一步完成对 Service 属性的注入。本步骤属于【属性赋值】阶段。
- 步骤三:执行 Bean 实现的 Aware 接口对应的方法,如 BeanNameAware 接口的
public void setBeanName(String name)
方法,Spring MVC 提供了很多 Aware 接口这里就不一一例举了。 - 步骤四:执行与加载当前 Bean 的 Spring 容器关联的 BeanPostProcessor 的
preProcessBeforeInitialization()
方法。 - 步骤五:执行 InitializingBean 接口的
afterPropertiesSet()
方法。本步骤属于【初始化】阶段。 - 步骤六:执行在配置文件中指定的
init-method
方法。本步骤属于【初始化】阶段。 - 步骤七:执行与加载当前 Bean 的 Spring 容器关联的 BeanPostProcessor 的
postProcessAfterInitialization()
方法。 - 步骤八:执行 DisposableBean 接口对应的
destory()
方法。本步骤属于【销毁】阶段 - 步骤九:执行在配置文件中指定的
destroy-method
方法。本步骤属于【销毁】阶段2.3.2、Srping Bean 生命周期涉及到的方法总结
归类总结提高记忆效率。
其实Spring Bean 生命周期各个阶段涉及到的方法可以归为三类,具体如下:
Bean 自身的方法
包括我们在配置bean时候设置的init-method方法和destroy-method方法。
Spring Bean 级别的生命周期方法
包括BeanNameAware、BeanFactoryAware、InitializingBean和DiposableBean这些接口的方法。
Spring 容器级别生命周期方法
包括InstantiationAwareBeanPostProcessor、BeanPostProcessor、BeanFactoryPostProcessor的实现类的方法
三、Spring MVC
Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet。一个好的框架要减轻开发者处理复杂问题的负担,内部有良好的扩展,并且有一个支持它的强大用户群体,恰恰 Spring MVC 都做到了。
3.1、什么是 MVC 设计模式
MVC是一种设计模式也是一种设计理念。 本节内容理解即可,不用刻意记忆。
MVC 是 Model-View-Controller 的缩写,它把软件系统分为 Model(模型)、View(视图)和 Controller(控制),实现 Model 和 View 分离的方法来组织代码,达到分层设计的目的,从而使代码解耦,便于维护和代码的复用。MVC是一种软件设计的理念,可以让我们的代码结构更加清晰明了,没有使用MVC的时候,我们的代码结构像下图那团乱麻一样,而MVC提供一种规则,使用MVC分层设计之后把相同类型的代码放在一起,这样就形成了层次,达到分层解耦、复用、便于测试和维护的目的。
3.2、Spirng MVC 的工作流程
Java 面试中的常客,你需要好好
内容较多,我已经单独编辑为一篇文章,详情查看 👉 SpringMVC 的工作流程
四、Spring 框架用到了哪些设计模式
设计模式结合实际考察的一种面试方式,在考察面试者对Spring的了解的深度的同时也考察了设计模式。
内容较多,我已经单独编辑为一篇文章,详情查看 👉 Spring 与设计模式
五、Spring 事务
事务是逻辑上的一组操作,要么都执行,要么都不执行。
本节内容较多已单独整理成文章 👉 Spring 事务