6Mybatis和Spring集成原理剖析

Spring启动扩展点

Spring如何做到与Dubbo,Mybatis等无缝集成?

集成Spring框架

  • 扩展点

InitializingBean


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
46
47
48
49
50
51
52
53
54
55
56
57
58
public class User implements InitializingBean, BeanNameAware {

private String name;

private Integer age;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Integer getAge() {
return age;
}

public void setAge(Integer age) {
this.age = age;
}


@PostConstruct
public void postC() {
System.out.println("user PostConstruct");
}

public User() {
System.out.println("user ctor");
}

@Override
public void afterPropertiesSet() throws Exception {
System.out.println("user initializingBean afterPropertiesSet");
}


public void init() {
System.out.println("user init");
}


@Override
public void setBeanName(String name) {
System.out.println("set BeanName:" + name);
}
}

@Configuration
public class BeanConfig {

@Bean(initMethod = "init")
public User user() {
return new User();
}
}

输出结果:
user ctor
set BeanName:user
user PostConstruct
user initializingBean afterPropertiesSet
user init

Aware

  • ApplicatinoContextAware
  • BeanNameAware
  • ApplicationEventPublisherAware

FactoryBean

  • 复杂对象创建
  • 对象以来Spring生命周期某个时间点(和生命周期其他扩展接口一起使用)

ApplicationListener

Spring框架事件处理核心类

MyBatis-Spring集成过程

SqlSessionFactoryBean类结构

MapperFactoryBean

SqlSessionDaoSupport

SqlSessionTemplate线程安全

线程不安全导致的问题?
SqlSession包含一个独立数据库连接Connection对象线程不安全,多线程共享SqlSession可能导致数据混乱,事务冲突。SqlSession还包含一级缓存,多线程共享可能导致数据不一致(A线程插入数据中途,B线程查询结果并缓存)。

Mybatis 的 SqlSession线程不安全,Spring集成如何保证安全?
SqlSessionDaoSupport类 构建了一个SqlSession 的代理对象。SqlSessionDaoSupport类 包含SqlSessionTemplate对象,SqlSessionTemplate对象包含SqlSession的代理对象,创建代理对象时将其放在ThreadLocal中,保证线程安全。

SqlSessionTemplate的定位

SqlSessionTemplate初始化

动态代理

SqlSessionHolder

TransactionSynchronizationManager

Spring 事件有哪些,如何扩展?