Skip to content
  • 项目一
    • Vue+JavaEE核心规范+Mysql
    • 采用MVC设计模式, 使用三层架构开发

image-20240110003225395

  • 项目二SpringMVC+SpringBoot

SpringMVC

image-20231231012352051

  • MVC设计模式的任务是将包含业务数据的模块和显示模块的视图解耦,即M和V做解耦,通过C来协调。SpringMVC就是MVC三层架构和容器(Spring)做了一个结合

  • 总结

Spring是Java企业版(Java Enterprise Edition,JEE,也称J2EE)的轻量级代替品

IOC将对象的依赖关系放在容器里处理,应用程序直接拿处理好的实例,这就是解耦的便利之处。类比把东西都拿到手里,还是放到书包里。并且拿到的都是同一个实例,保证单例

AOP解决事务管理,异常处理,日志,缓存等,解决非业务代码的抽取问题

对象是单例的,降低开销提高效率

SpringBoot解决了Spring的配置问题,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中

JavaEE阶段 ​

Servlet、Request&Response、Conversation、Web三大组件、MVC三层架构

  • MVC设计模式,三层架构区别
    • MVC:Model(输入)、View(输出)、Controller(处理)。MVC其实说的就是一个事情:解耦。强制性地使应用程序的输入、处理和输出分开,它们各自处理自己的任务。Controller连接View和Model,最终在View中加载Model封装的信息
    • 三层架构:表示层、业务逻辑层、数据访问层
    • 三层架构这里和MVC并不是冲突的概念,而是在MVC的基础上进一步解耦,在中间增加增加了一层业务逻辑层

Spring ​

Spring是Java企业版(Java Enterprise Edition,JEE,也称J2EE)的轻量级代替品。

IOC ​

IOC是Inverse of Control的简称,中文叫控制反转。指的是将实例的生成权由应用程序反转给Spring容器,由Spring容器来管理实例,从而降低应用程序各个实例之间的耦合度。

DI ​

DI是Dependency Injection的简称,中文叫依赖注入。依赖注入是控制反转的延续,当容器创建组件的时候,同时给这个组件注入他需要的依赖,这个依赖可以是容器中的其他组件,也可以是一些值。

依赖注入更多的话大家可以认为是维护组件之间的依赖关系,避免你在使用的时候再来进行维护

AOP ​

AOP是Aspect oriented Programming的简称,中文叫面向切面编程。

AOP就是把委托类变成代理类放到容器中,对容器中的组件做增强,而增强的方式是动态代理(如果有接口的实现是JDK动态代理,如果没有接口的实现则是CGlib动态代理)

对标OOP通过继承扩展功能,AOP是通过动态代理扩展功能,就是将分散在各个业务逻辑代码中相同的代码通过横向切割的方式抽取到一个独立的模块中

AspectJ ​

切入点表达式 ​
  • execution
  • @annotation
  • @target
Advice通知 ​

具体的增强的代码

  • before
  • after 始终执行
  • around
  • afterReturning 抛出异常则不执行
  • afterThrowing
JoinPoint连接点 ​
  • Signature 方法的描述
  • This 代理对象
  • Target 委托类对象
  • Arguments 参数
Aspect切面 ​

Bean生命周期 ​

生命周期指组件在容器中要完成实例化,组件从实例化开始直至可用状态会执行到哪些过程。

  • 单例singleton是立即加载,容器初始化的时候开始生命周期的,并且会执行到destroy方法
  • 原型prototype是懒加载,获得容器中组件的时候开始生命周期的,每次获得组件都会执行生命周期方法,并且不会执行到destroy方法

初始化 ​

  1. Bean的实例化
  2. 设置参数方法
  3. BeanNameAware、BeanFactoryAware、ApplicationContextAware
  4. BeanPostProcessor的postProcessBeforeInitialization
  5. InitializingBean的afterPropertiesSet方法
  6. 自定义的init方法 @PostConstruct
  7. BeanPostProcessor的postProcessAfterInitialization
  • 注意BeanPostProcessor的作用范围,容器中除了它自己以外的所有组件

关闭 ​

单例的组件才会执行到对应的方法

DisposableBean接口的destroy方法

自定义的destroy方法@PreDestory

  • BeanFactory和FactoryBean

BeanFactory是ApplicationContext的父接口。FactoryBean是Spring做出特殊处理的一个接口

联系:通过他两都可以向容器中注册组件

区别:BeanFactory是容器,所有的组件注册都是通过BeanFactory;而FactoryBean注册的特定的单个组件

  • Spring中的Bean是线程安全的吗

    prototype 作用域下,每次获取都会创建一个新的 bean 实例,不存在资源竞争问题,所以不存在线程安全问题。

    singleton 作用域下,IoC 容器中只有唯一的 bean 实例,可能会存在资源竞争问题(取决于 Bean 是否有状态)。如果这个 bean 是有状态的话,那就存在线程安全问题(有状态 Bean 是指包含可变的成员变量的对象)。

    不过,大部分 Bean 实际都是无状态(没有定义可变的成员变量)的(比如 Dao、Service),这种情况下, Bean 是线程安全的。

    对于有状态单例 Bean 的线程安全问题,常见的有两种解决办法:

    1. 在 Bean 中尽量避免定义可变的成员变量。
    2. 在类中定义一个 ThreadLocal 成员变量,将需要的可变成员变量保存在 ThreadLocal 中(推荐的一种方式)

    著作权归JavaGuide(javaguide.cn)所有 基于MIT协议 原文链接:https://javaguide.cn/system-design/framework/spring/spring-knowledge-and-questions-summary.html

Spring事务 ​

传播行为

Spring设计模式 ​

SpringMVC ​

核心流程 ​

image-20240113082500177

image-20231231014804266

让一部分组件提前初始化

image-20231231014819967

SpringBoot ​

  • 虽然Spring的组件代码是轻量级的,但它的配置却是重量级的。SpringBoot引导我们快速开发,基于 Spring 框架的应用程序
  • 比如我们在SpringMVC阶段整合MyBatis,需要注册DataSource,SqlSessionFactoryBean,MapperScannerConfiguraler,PlatFormTransactionManager。SpringBoot有约定,注册默认组件
  • 核心:约定大于配置
  • 通常在SpringBoot中要使用某一项技术,只需要引入其starter依赖就可以了
    • 引入一系列依赖
    • autoconfigure依赖,自动配置类,提供默认配置,自动注册默认的组件
  • SpringBoot自动配置原理

微服务 ​

  • 从单体架构到微服务
    • 单体架构是把所有模块都部署到同一个进程中的架构风格,可以通过nginx扩容为单体应用集群
    • 微服务就是把应用程序分解为一组服务的架构风格,是模块化开发的一种形式
    • 大型应用需要拆分模块,单体应用通过包拆分,但边界不清晰且包与包之间互相依赖
    • 微服务架构,使用微服务作为模块化的单元,访问服务只能用过其对外提供的API
  • SpringCloud是实现微服务架构的一套解决方案
  • 注册中心解决服务的自动注册和自我发现
  • Ribbon是一个实现客户端负载均衡的组件,解决服务服务调用的负载均衡
  • OpenFeign帮我们把接口翻译成http请求,调用远程服务就像调用本地方法一样。充当着一个“翻译”的角色,可以将我们的Java接口翻译为对应的Http APIs,帮助我们实现,让服务调用代码与Restful风格的Http请求解耦的功能