Spring、SpringBoot及MyBatis

492 阅读7分钟

Spring

轻量型,松耦合的集成开发框架

好处

  • ​ 轻量
  • 控制反转:通过IOC的技术低耦合;一个对象依赖其他对象通过被动的方式传递而不是自己创建对象
  • 面向切面:支持面向切面编程,将业务逻辑与系统服务分开
  • 容器化
  • 方便集成各种框架
  • 声明式事务

核心模块

  • AOP:通过管理配置管理特性,面向切面编程。该模块基于Spring的应用程序中的对象提供了事务管理服务
  • ORM:提供ORM对象关系工具:JDO,Hibernate等
  • Web:建立在应用程序上下文模块上,为基于Web应用程序提供上下文
  • MVC:是一个全功能的构建Web应用的MVC实现。通过策略接口,MVC编程高度可配置的,MVC容纳了大量视图技术:JSP等
  • DAO:DAO抽象层提供了而有意义的异常层次结构,来管理异常处理和不用数据库抛出的错误信息。
  • Context:是一个配置文件,向Spring框架提供上下文信息
  • Core:提供框架基本功能,管理Spring应用中Bean的创建、配置和管理。主要组件BeanFactory,工厂模式的实现。

IOC和DI

控制反转模式也称作依赖注入:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但是在配置文件中描述哪一个组件需要那一项服务。容器负责将这些联系在一起。

  • 原始做法:调用者主动创建被依赖对象,然后再调用被依赖对象的方法
  • 简单工厂模式:调用者先找到被依赖对象的工厂,然后主动通过工厂去获取被被依赖对象,最后再调用被依赖对象的方法

IOC就是将这些主动获取变成被动接受。

作用

  • 管理对象的创建和依赖关系的维护。
  • 解耦,由容器去维护具体的对象
  • 托管了类的产生过程,无需关心这些类是怎么产生的

注入方式

  • 接口注入
  • 构造器注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖
  • Setter注入:Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法

Bean的生命周期

  • Spring对bean进行实例化
  • Spring将值和bean的引用注入到bean对应的属性中
  • 如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBean-Name()方法
  • 如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入
  • 如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来
  • 如果bean实现了BeanPostProcessor接口,Spring将调用它们的post-ProcessBeforeInitialization()方法
  • 如果bean实现了InitializingBean接口,Spring将调用它们的after-PropertiesSet()方法。类似地,如果bean使用initmethod声明了初始化方法,该方法也会被调用
  • 如果bean实现了BeanPostProcessor接口,Spring将调用它们的post-ProcessAfterInitialization()方法
  • 如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用

Spring支持的事务管理类型

  • 编程式事务管理:灵活性大,但难维护
  • 声明式事务管理:业务与事务分离,只需用注解和xml配置管理

事务的实现方式和实现原理

本质就是数据库对事务的支持,没有数据库的支持,spring也无法提供事务。真正的数据库层的事务提交和回滚是通过binlog或者redo log实现

事务传播行为

  • 如果没有事务,就创建一个新的;如果存在就加入
  • 如果当前存在就加入,不存在就以非事务执行
  • 如果事务存在就加入,不存在就抛异常
  • 创建新事务,无论存不存在
  • 以非事务执行,如果存在就把事务挂起
  • 以非事务执行,如果存在就抛异常
  • 如果存在就嵌套事务内执行,不存在就按Required属性执行

BeanFactory与ApplicationContext区别

ApplicationContext是BeanFactory的子接口

依赖关系

BeanFactory是Spring最底层的接口,包含各种Bean的定义。读取bean配置文档,管理bean的加载、实例化,控制bean的生命周期,维护bean之间的依赖关系。

ApplicationContext因为是子接口,所有拥有BeanFactory的功能外,还提供:

  • 继承MessageSource,因此支持国际化
  • 统一的资源文件访问方式
  • 提供在监听器中注册bean的事件
  • 同时加载多个配置文件
  • 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层

加载方式

BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化

ApplicationContext,它是在容器启动时,一次性创建了所有的Bean

创建方式

BeanFactory通常以编程的方式被创建,ApplicationContext还能以声明的方式创建

注册方式

BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册。

SpringMVC

流程

  • 客户端请求
  • DispatcherServlet中央处理器接收并寻找处理器HandlerMapping
  • 调用处理器Controller
  • 调用模型处理业务Service
  • 返回ModelAndView给中央处理器
  • 处理视图映射
  • 将模型数据传给View显示
  • 返回客户端

主要包

  • 核心容器包
    • beans
    • context
    • core
    • expression
  • 依赖日志包
    • logging
    • log4j
  • 测试类包
    • test
    • junit
  • 测试类用到AOP包
    • aop

常用注解

开启对xx的支持

@EnableAspectJAutoProxy

开启对AOP自动 代理的支持

@EnableAsync

开启异步方法支持

@EnableScheduling

开启计划任务支持

@EnableWebMvc

开启WebMVC的配置支持

@EnableConfigurationProerties

开启对@ConfigurationProperties注解配置Bean的支持

@EnableCaching

开启注解式缓存支持

@EnableTransactionManagement

开启注解式事务支持

用于注册Bean

@Component

调用无参构造创建一个Bean对象,并把对象存入SpringIOC容器,交由容器管理

@Controller

同上,一般作用于表现层

@Service

一般作用于业务层

@Repository

一般作用于持久层

@Bean

用于把当前方法的返回值作为Bean对象存入SpringIOC容器

@Configuration

声明当前类为配置类

@ComponentScan

扫描Component类

@WishlyConfiguration

@Configuration与@ComponentScan结合

用于依赖注入

@Autowired

按照类型装配,若想要按照名称装备需结合@Qualifier

@Qualifier

在自动按照类型注入的基础上,再按照Bean的id注入。

@Resource

按照名称装配,也可通过属性name指定

装配顺序
  • 如果同时指定name和type属性,则找到唯一匹配的bean装配
  • 如果指定name属性,则按照名称装配
  • 如果指定type熟悉感,则按照类型装配
  • 既未指定name,又未指定type,则按照名称装配
@Value

将外部的值注入到Bean中

@Value("${jdbc.url}")//注入配置文件
@Value("#{jdbc.url}")//注入其他bean属性
@Value("classpath:com/test.txt")//注入文件资源

用于改变bean的作用范围

@Scope

指定bean作用范围

  • value
    • singleton:单例
    • prototype:多例
    • request:每一次请求都会产生一个新的Bean,仅对当前HTTP request内有效
    • session:每一次请求都会产生一个新的Bean,仅对当前HTTP session内有效
    • global session

生命周期相关的注解

@PostConstruct

指定初始化方法

@PreDestory

指定销毁方法

AOP切面注解

@EnableAspectJAutoProxy

开启Spring对AspectJ代理的支持

@After

在方法执行后执行

@Before

在方法执行前执行

@Aspect

声明切面类

@Around

在方法执行前后执行

@PointCut

声明切点

生命周期

实例化

createBeanInstance()

属性赋值

populateBean()

初始化

initializeBean()

销毁

SpringBoot

好处

  • 独立运行:内置Servlet、tomcat、jetty等,不需要打成war包部署
  • 简化配置:spring-boot-starter-web启动器自动依赖其他组件,减少了maven配置
  • 自动配置:能根据当前类路径下的类、jar包来自动配置bean。
  • 无代码生成和xml配置:配置借助于注解完成
  • 应用监控:提供一系列端点可以监控服务及应用

核心注解

@SpringBootApplication

  • @SpringBootConfiguration:实现配置文件功能
  • @EnableAutoConfiguration:打开自动配置功能
  • @ComponentScan:Spring组件扫描

SpringBoot中的starters

可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成Spring及其他技术么不需要到处找示例代码和依赖包。

Spring、SpringMVC、SpringBoot区别

  • Spring最重要的特征是依赖注入。所有 SpringModules 不是依赖注入就是 IOC 控制反转
  • Spring MVC 提供了一种分离式的方法来开发 Web 应用
  • Spring Boot 通过一个自动配置和启动的项来目解决这个问题。为了更快的构建产品就绪应用程序,Spring Boot 提供了一些非功能性特征。

MyBatis

半ORM框架,封装了JDBC,开发时只需要关心SQL语句本身,不需要花费精力去加载驱动等过程。可以编写原生态sql,灵活度高

优点

  • 基于SQL编写,灵活,接触SQL与程序代码的耦合
  • 与JDBC相比,消除了JDBC大量的冗余,不需要手动开关
  • 提供映射标签,支持对象与数据库的ORM字段关系映射

缺点

  • SQL语句编写工作量大,需要有一定给的SQL功底
  • SQL语句依赖于数据库导致数据库移植性差

#{}与${}区别

前者是预编译,后者是字符替换

一级二级缓存

一级缓存

基于HashMap本地缓存,存储作用域为session。默认打开

二级缓存

与一级缓存相同,不同的是作用域为Mapper,并且可自定义存储源。默认不打开,要打开需要实现序列化接口

对于缓存更新机制,当某一作用域下进行了CUD操作后,默认该作用域下所有的select中的缓存将被清空

SqlSession运行过程

映射器的动态代理

  • Mapper映射是通过动态代理来实现的,使用JDK动态代理返回一个代理对象,供调用者访问。

  • 实现InvocationHandler接口的类,Mapper是一个接口,会生成MapperMethod对象,调用execute方法

  • MapperMethod采用命令模式,根据不同的sql操作,做不同的处理

  • 生成代理类的方法,就是使用JDK动态代理Proxy来创建的

SqlSession下的四大对象

  • Executor:执行器,由它统一调度其他三个对象来执行对应的SQL;

  • StatementHandler:使用数据库的Statement执行操作;

  • ParameterHandler:用于SQL对参数的处理;

  • ResultHandler:进行最后数据集的封装返回处理;

在MyBatis中存在三种执行器

  • SIMPLE:简易执行器,默认的执行器;
  • REUSE:执行重用预处理语句;
  • BATCH:执行重用语句和批量更新,针对批量专用的执行器;