[Spring]面试

Springboot组件

  • SpringMVC:提供了一套丰富的MVC架构。
  • Thymeleaf:一个现代化的服务端Java模版引擎,可以将HTML模版渲染成动态的Web页面。
  • Spring Security:安全框架。
  • Spring Data JPA:快速访问和操作数据库。

MVC

MVC是一种设计模式,将软件分成三层:模型层、视图层、控制器层。

  • 模型层代表数据。
  • 视图层代表界面。
  • 控制器层代表的是逻辑处理,是连接视图与模型之间的桥梁。

SpringMVC

    1. 用户点击某个请求路径,会发起一个HTTPrequest请求,该请求会被提交到DispatcherServlet(前端控制器)。
    1. 由DispatcherServlet请求一个或多个HandlerMapping(处理器映射),并返回一个执行链。
    1. DispatcherServle将执行链返回的Handler信息发送给HandlerAdapter。
    1. HandlerAdapter根据Handler信息找到执行相应的Handler(或者说Controller)。
    1. Handler执行完毕后给HandlerAdapter一个ModeAndView对象(Spring MVC的底层对象,包括Model数据模型和View视图信息)。
    1. HandlerAdapter接收到ModelAndView对象后,将其返回给DispatcherServle。
    1. DispatcherServle接收到ModelAndView后,请求ViewResolver(视图解析器)对视图进行解析。
    1. ViewResolver根据View匹配相应的视图结果,返回给DispatcherServle。
    1. DispatcherServle接收到具体的View视图后,渲染视图,将Model中的模型数据填充到View视图中的request域,生成最终的View。
    1. 视图负责将结果显示到浏览器(客户端)。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的实现方式。,它的本质是一个工厂。
    具体的实现中,主要有三种注入方式:
    1. 构造方法注入
    1. setter方法注入。
    1. 接口注入

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
      • 自动扫描并加载符合条件的类。
  • run方法:

    • 服务构建:
      • 构建SpringApplication:
        • 将资源加载器、主方法类记录在内存中。
        • 逐一判断对应的服务类是否存在,判断Web服务类型。
        • 加载初始化类,读取Meta-INF/Spring.factories文件中“注册初始化”、“上下文初始化”和“监听器”这三类配置。“注册初始化”没有默认的方法。
        • 通过运行栈判断出main方法所在的类。
    • 环境准备
      • 调用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

  • 标注在方法上,表示该方法是异步方法,会在另一个线程中执行。