• java
  • go
  • 数据库
  • linux
  • 中间件
  • 书
  • 源码
  • 夕拾

  • java
  • go
  • 数据库
  • linux
  • 中间件
  • 书
  • 源码
  • 夕拾

spring-概览

spring 概览

spring概览…….

内容未全部完成

  • spring 概览
    • spring-核心容器
      • spring-core
      • spring-bean
      • spring-context
    • aop
      • aop
      • aspects
      • instrumentation
    • 数据访问
      • jdbc
      • orm
      • oxm
      • transaction
    • web
      • webmvc
      • webflux
      • websocket
    • spring的设计模式
    • spring的事件
    • 关于bean
      • bean的类型
      • bean的生命周期
        • 实例化
        • 注入aware相关属性
        • 调用相应初始化后的方法
        • bean的销毁
    • spring注解
    • spring事务
      • 事务隔离级别
      • 事务传播(七类)

spring-核心容器

其实主要就是ioc

spring-core

故名思意,核心模块.. 定义了资源访问模式。(resource)

spring-bean

故名思意,主要解决关于bean的问题:

  1. bean定义
  2. bean的解析
  3. bean的创建
  • 典型的工厂模式,其顶级接口:BeanFactory
    类图.png

spring-context

spring中上下文,bean运行时环境,保存各个对象状态。
还提供了其他高级特性,比如事件发布、国际化信息支持等

aop

aop

springboot的aop都是 cglib….

aspects

支持与Aspectj集成

instrumentation

没用过…..

数据访问

jdbc

orm

oxm

transaction

web

webmvc

webflux

websocket

spring的设计模式

目前接触

  • 单例(bean默认为单例)
  • 代理(aop)
  • 模板(jdbcTemplate)
  • 控制器(dispatcher)
  • 工厂(beanfactory)

spring的事件

  1. refresh事件(ContextRefreshdEvent),在ConfigurableApplicationContext的 refersh()方法被调用时触发
  2. start事件,容器调用ConfigurableApplicationContext的 start()方法被调用时触发
  3. stope事件,容器调用ConfigurableApplicationContext的 stop()方法被调用时触发
  4. close事件,ApplicationContext被关闭时触发。所有bean被销毁
  5. web请求事件,一个httpRequest结束触发。

关于bean

bean的类型

  1. singleton-单例,默认
  2. prototype-每次请求,一个
  3. request-http请求,一个,仅当前http请求有效
  4. session,一个session,一个,仅在当前http-session有效
  5. application,每个webapplication一个。

bean的生命周期

实例化

xml,注解或者configuration提供bean的初始化

注入aware相关属性

  1. BeanNameAware,工厂会通过传递bean的beanName调用setBeanName(String name)方法
  2. BeanFactoryAware,工厂传递自身实例调用setBeanFactory(BeanFactory beanfactory)

调用相应初始化后的方法

  1. 如果存在与该bean相关联的BeanPostProcessor,则调用preProcessBeforeInitialization(Object bean, String beanName)
  2. InitializingBean调用其afterPropertieSet()方法。
  3. 如果xml中指定init-method方法,调用该方法。
  4. 如果存在与该bean相关联的BeanPostProcessor,则调用postProcessAfterInitialization(Object bean, String beanName)

bean的销毁

  • 非单例的,交给客户端。

  • 单例托管给spring-ioc

  • 如果实现了disposableBean接口,spring容器关闭时,调用#destroy()方法。

  • 如果xml指定destroy方法,则调用该方法。

spring注解

bean注解

  1. @Component
  2. @Service(其实和component一样,不会提供其他特殊功能, 🙂)
  3. @Controller
  4. @RestController
  • @Required,应用于bean的setter方法。emm,没用过,- -!
  • @Autowired
  • @Qualifier 当你创建多个相同类型的 Bean ,并希望仅使用属性装配其中一个 Bean 时,您可以使用 @Qualifier 注解和 @Autowired 通过指定 ID 应该装配哪个确切的 Bean 来消除歧义。

spring事务

  • 注意:spring中,在开启的service事务中,无法切换数据源。在spring的事务管理中,所使用的数据库链接和当前线程绑定。

事务隔离级别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// TransactionDefinition.java

/**
* 【Spring 独有】使用后端数据库默认的隔离级别
*
* MySQL 默认采用的 REPEATABLE_READ隔离级别
* Oracle 默认采用的 READ_COMMITTED隔离级别
*/
int ISOLATION_DEFAULT = -1;

/**
* 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读
*/
int ISOLATION_READ_UNCOMMITTED = Connection.TRANSACTION_READ_UNCOMMITTED;

/**
* 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生
*/
int ISOLATION_READ_COMMITTED = Connection.TRANSACTION_READ_COMMITTED;
/**
* 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
*/
int ISOLATION_REPEATABLE_READ = Connection.TRANSACTION_REPEATABLE_READ;
/**
* 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
*
* 但是这将严重影响程序的性能。通常情况下也不会用到该级别。
*/
int ISOLATION_SERIALIZABLE = Connection.TRANSACTION_SERIALIZABLE;

事务传播(七类)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// TransactionDefinition.java

// ========== 支持当前事务的情况 ==========

/**
* 如果当前存在事务,则使用该事务。
* 如果当前没有事务,则创建一个新的事务。
*/
int PROPAGATION_REQUIRED = 0;
/**
* 如果当前存在事务,则使用该事务。
* 如果当前没有事务,则以非事务的方式继续运行。
*/
int PROPAGATION_SUPPORTS = 1;
/**
* 如果当前存在事务,则使用该事务。
* 如果当前没有事务,则抛出异常。
*/
int PROPAGATION_MANDATORY = 2;

// ========== 不支持当前事务的情况 ==========

/**
* 创建一个新的事务。
* 如果当前存在事务,则把当前事务挂起。
*/
int PROPAGATION_REQUIRES_NEW = 3;
/**
* 以非事务方式运行。
* 如果当前存在事务,则把当前事务挂起。
*/
int PROPAGATION_NOT_SUPPORTED = 4;
/**
* 以非事务方式运行。
* 如果当前存在事务,则抛出异常。
*/
int PROPAGATION_NEVER = 5;

// ========== 其他情况 ==========

/**
* 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行。
* 如果当前没有事务,则等价于 {@link TransactionDefinition#PROPAGATION_REQUIRED}
*/
int PROPAGATION_NESTED = 6;
application中的bean加载
spring-ioc 部分interface接口
  1. 1. spring 概览
    1. 1.1. spring-核心容器
      1. 1.1.1. spring-core
      2. 1.1.2. spring-bean
      3. 1.1.3. spring-context
    2. 1.2. aop
      1. 1.2.1. aop
      2. 1.2.2. aspects
      3. 1.2.3. instrumentation
    3. 1.3. 数据访问
      1. 1.3.1. jdbc
      2. 1.3.2. orm
      3. 1.3.3. oxm
      4. 1.3.4. transaction
    4. 1.4. web
      1. 1.4.1. webmvc
      2. 1.4.2. webflux
      3. 1.4.3. websocket
    5. 1.5. spring的设计模式
    6. 1.6. spring的事件
    7. 1.7. 关于bean
      1. 1.7.1. bean的类型
      2. 1.7.2. bean的生命周期
        1. 1.7.2.1. 实例化
        2. 1.7.2.2. 注入aware相关属性
        3. 1.7.2.3. 调用相应初始化后的方法
        4. 1.7.2.4. bean的销毁
    8. 1.8. spring注解
    9. 1.9. spring事务
      1. 1.9.1. 事务隔离级别
      2. 1.9.2. 事务传播(七类)
© 2023 haoxp
Hexo theme