[Spring]面试
Springboot组件
- SpringMVC:提供了一套丰富的MVC架构。
- Thymeleaf:一个现代化的服务端Java模版引擎,可以将HTML模版渲染成动态的Web页面。
- Spring Security:安全框架。
- Spring Data JPA:快速访问和操作数据库。
MVC
MVC是一种设计模式,将软件分成三层:模型层、视图层、控制器层。
- 模型层代表数据。
- 视图层代表界面。
- 控制器层代表的是逻辑处理,是连接视图与模型之间的桥梁。
SpringMVC
- 用户点击某个请求路径,会发起一个HTTPrequest请求,该请求会被提交到DispatcherServlet(前端控制器)。
- 由DispatcherServlet请求一个或多个HandlerMapping(处理器映射),并返回一个执行链。
- DispatcherServle将执行链返回的Handler信息发送给HandlerAdapter。
- HandlerAdapter根据Handler信息找到执行相应的Handler(或者说Controller)。
- Handler执行完毕后给HandlerAdapter一个ModeAndView对象(Spring MVC的底层对象,包括Model数据模型和View视图信息)。
- HandlerAdapter接收到ModelAndView对象后,将其返回给DispatcherServle。
- DispatcherServle接收到ModelAndView后,请求ViewResolver(视图解析器)对视图进行解析。
- ViewResolver根据View匹配相应的视图结果,返回给DispatcherServle。
- DispatcherServle接收到具体的View视图后,渲染视图,将Model中的模型数据填充到View视图中的request域,生成最终的View。
- 视图负责将结果显示到浏览器(客户端)。s s
Bean的生命周期
- 创建:
- Spring启动,查找并加载所需的Bean,然后初始化。
初始化:
- 对Bean进行依赖注入。
- 如果Bean中实现了BeanNameAware接口(@Resouce、@Qualifiter),Spring会将Bean的Id传入SeBeanName方法去执行。
- Aware接口:实现了Aware接口的bean在被初始化之后,可以获取相应资源。Aware的中文意思为感知。
- 如果Bean实现了BeanFactoryAware接口,Spring会调用Bean的setBeanFactory方法将BeanFactory的ioc容器传入。
调用:
- 正常使用
- 销毁:
- 容器关闭时,调用Bean的销毁方法。
这个过程主要有Spring自己来管理,但是我们可以自定义初始化方法和销毁方法。
总结:
- [Bean定义]首先扫描Bean,加载Bean定义 ->
- [Bean定义]Bean定义和Bean工厂后置处理 ->
- [依赖注入]根据Bean定义通过反射创建Bean实例 ->
- [依赖注入]进行依赖注入(顺便解决循环依赖问题)->
- [初始化Bean]BeanPostProcessor的初始化之前方法 ->
- [初始化Bean]Bean初始化方法 ->
- [初始化Bean]BeanPostProcessor的初始化之前后方法 ->
- [完成]最终得到的Bean加载完成的实例
Spring的核心
IoC
- IoC是控制反转的意思,是一种面向对象编程的设计思想。他帮我们维护了对象与对象之间的依赖关系,降低对象之间的耦合度。
- 依赖注入是Ioc的实现方式。,它的本质是一个工厂。
具体的实现中,主要有三种注入方式: - 构造方法注入
- setter方法注入。
- 接口注入
AOP
- 面向切面编程。原理是通过动态代理实现的。
- 他将程序抽象成各个切面。可实现业务逻辑与系统逻辑的分离。
Spring容器
BeanFactory
- 是基础类型的Ioc容器,提供完整的Ioc服务支持。
- 如果没有特殊指定,默认采用延迟初始化策略。(懒汉模式)
- 只有当客户端对象需要访问容器中某个受管对象的时候,才会对这个对象进行初始化以及依赖注入操作。
ApplocationContext:
- 它是在BeanFactory的基础上构造的。拥有BeanFactory的所有实现。
- 它的管理的对象在该类容器启动之后,默认全部初始化并完成绑定。
BeanFactory
- 它是一个工厂,与传统类工不同的是,它是类的通用工厂,可以创建并管理各种类的对象。
- BeanFactory是Spring容器的顶层接口。
Spring是如何管理Bean的
- 通过Ioc容器管理Bean,
- 一般会采用XML或者注解的方法,现在大多数时候会使用注解配置方式:
- 1.@ComponentScan用于生命扫描测量。
- 2.@Component、@Repository、@Service、@Controller用于声明Bean,它们的作用一样,但是语义不同:
- @Component用于声明通用的Bean。
- @Repository用于声明DAO层的Bean。
- @Service用于声明业务层的Bean。
- @Controller用于声明是吐槽的控制器Bean。
- 被这些注解声明的类可以被容器扫描并创建。
- 3.@Autowired、@Qualifier用于注入Bean,即告诉容器当前属性注入到哪个Bean中。
- @Autowired:只能按照类型注入。也可以通过@Qualifier指定类的名称,消除歧义。
- @Resource:默认按照名称注入,如果指定了name属性,则按照指定的名称注入;没有则按照属性名称进行匹配。
- 4.@Scope用于声明Bean的作用域:
- 默认情况下Bean是单例的,即在整个容器中这个类型只有一个实例。
- peototype:声明为多例。
- seeesion:同一个HttpsSession共享一个bean,不同的Sesiion使用不同的Ben。
- request:每次请求都会创建一个新的Bean。
SpringBoot的理解
- 从本质上来说,SpringBoot就是Spring,帮助我完成了一些SpringBean的配置。
- 使用”习惯优于配置”的理念让你的项目快速地运行起来。
- 自动配置:针对很多Spring应用程序常见的应用功能,他能自动提供相关配置。
- 优点:
- 可以快速构建项目
- 针对主流开发框架的无配置集成。
- 项目可以独立运行,无需外部依赖Servlet容器。
- 提供运行时的应用监控。
SpringBoot的启动流程
- 默认生成一个Application类,通过此启动。
此类上有@SpringBootApplication的启动类,此类由以下洒哥注解连起来构成:
- @EnableAutoConfiguration:
- 核心。
- 启动时会将所有符合条件的@Configuration配置都进行加载。
- @SpringBootConfiguration
- 等价于Configuration,会被加载到容器中,
- @ComponentScan
- 自动扫描并加载符合条件的类。
- @EnableAutoConfiguration:
run方法:
- 服务构建:
- 构建SpringApplication:
- 将资源加载器、主方法类记录在内存中。
- 逐一判断对应的服务类是否存在,判断Web服务类型。
- 加载初始化类,读取Meta-INF/Spring.factories文件中“注册初始化”、“上下文初始化”和“监听器”这三类配置。“注册初始化”没有默认的方法。
- 通过运行栈判断出main方法所在的类。
- 构建SpringApplication:
- 环境准备
- 调用run方法进行环境准备阶段。
- new一个“启动上下文”。
- 逐一调用刚刚加载的“注册初始化器”。
- 启动“运行监听器”,发布启动事件。
- 通过prepareEnvironment方法“组装启动参数”:
- 构造一个“可配置环境”,根据不同的Web服务类型构造不同的环境,
- 加载系统环境变量、jvm系统属性。
- 元数据不加载
- 容器创建
- 创建构造和BeanFactory,
- 用来解析@ComponentScan,@Component等注解的后处理器。
- 用来解析@Autowired、@Value、@Inject等注解的自动注解Bean处理器。
- 填充容器
- 服务构建:
简单的说
- 创建SpringApplication实例化,再这个对象调用自己的run方法。
- 获取监听器参数配置。
- 打印Banner信息。
- 创建并初始化容器。
- 监听器发送通知。
Sprigboot自动装配
简单的说就是将第三方组建的bean装在到IOC容器里,不用开发者再去写Bean的装配配置。
- 通过@SpringApplcation注解总的@EnableAutoConfigration注解完成。
- 首先冲Spring.facotories中寻找autoconfiguration类,当某个类满足指定条件时,便会实例化该类并注册,放入ioc容器中进行管理,实现依赖注入的自动配置。
常见注解:
@SpringBootApplication
- 启动Springboot应用程序的主要注解。
- 整合了@EnableAutoConfiguration,@CompnentScan,@Configuraion.
@RestController
- 标志在控制器类上,会自动将返回的对象序列化为JSON格式。
@RequestMapping
- 映射请求的URL路径到控制器的方法上。
- 支持Get,Post,PUT,Delete等请求方式。
@Component
- 标记为组件,可以被Spring自动扫描并注入其他对象中。
AutoWired
- 自动装配依赖对象。
Bean
- 将方法返回的对象注册为Spring的Bean。
Conditonal
- 根据条件选择是否装配Bean。
@Async
- 标注在方法上,表示该方法是异步方法,会在另一个线程中执行。