spring transaction源码分析

配置

以最简单的jdbc事务为例:

1
2
3
4
5
6
7
8
9
10
11
<!-- 数据源以Sping自带为例,每次请求均返回一个新的连接 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>

查看更多

spring task源码分析

开头

从功能上来说,spring-task这个组件主要包括了两个/两种功能:

  • 任务的定时调度/执行,对应xml配置的task:scheduler和task:scheduled-tasks标签。
  • 方法异步执行,对应xml配置的task:executor标签。

task:annotation-driven标签被以上两种功能共有。下面就这两种功能分别进行说明。

查看更多

spring aop源码分析

开头

aop部分的解析器由AopNamespaceHandler注册,其init方法:

1
2
3
4
5
6
@Override
public void init() {
registerBeanDefinitionParser("config", new ConfigBeanDefinitionParser());
registerBeanDefinitionParser("aspectj-autoproxy", new AspectJAutoProxyBeanDefinitionParser());
registerBeanDefinitionDecorator("scoped-proxy", new ScopedProxyBeanDefinitionDecorator());
}

查看更多

JDK动态代理的实现

什么是动态代理

问题引入

有这样一个类:

1
2
3
4
5
6
7
public class Hello {

public void say() {
System.out.println("hello world");
}

}

现在有一个需求:需要在Hello类运行say()方法前后使用日志记录下运行的时间戳,该怎么做?

查看更多

Java容器源码分析之HashMap与HashSet

HashMap与HashSet介绍

HashMap是Java为我们提供的一个存放键值对的容器,通过键的hash值定位存储位置,具有很快的访问速度。但是其遍历顺序是不确定的,这里所说的不确定是指其遍历的顺序与放入顺序不一致、多次遍历输出顺序不一致(可能会放进数据导致reHash,改变原有顺序)。HashMap允许有一个null的键,对于值没做要求。HashMap也是个非线程安全的容器,在并发环境下可以使用ynchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap。

HashSet是Java为我们提供的一个集合类容器,他不允许容器内元素重复,底层采用HashMap实现(适配器模式)。

查看更多

Java容器源码分析之LinkedList

LinkedList简介

LinkedList是一个使用双向链表结构实现的容器,与ArrayList一样,它能动态扩充其长度,LinkedList相较于ArrayList,其任意位置插入速度比ArrayList要快,但是其查询速度要比ArrayList要慢;LinkedList继承自AbstractSequentialList,实现了List、Deque、Cloneable、Serializable接口。

查看更多