一场雨

spring事务管理及资源加载机制

事务管理

spring将事务的管理委托给了持久层的框架

四个特性:原子性,一致性,隔离性,持久性。

事务的隔离级别,四层。

jdbc对事务的管理,2.0的时候只有:提交和回滚。

不管选择的是Spring JDBC,Hibernate,jpa,还是ibatis,spring为为事务管理提供统一的模板,声明式事务管理。

Spring的事务管理spi的抽象层主要包括3个接口,分别是PlatformTransationManager,TransationDefinition和TransationStatus.

TransationDefinition描述事务的隔离级别,超时时间,是否为只读事务等控制事务具体行为的事务属性,这些事务属性可以通过xml配置或者注解描述提供,也可以通过手动编程的方式进行设置。

PlatformTransationManager根据TransationDefinition提供的事务属性配置信息,创建事务,并用TransationStatus来描述这个激活事务的状态。

不同的持久层框架对应不同的事务管理器的实现类。

编程式事务管理:TransactionTemplate

xml配置声明式事务管理:通过spring aop实现,通过事务的声明信息,spring将事务管理增强逻辑动态的织入到业务的方法相应的连接点中。这些逻辑就包括:获取线程绑定资源,开始事务,提交/回滚事务等。

注解配置声明式事务:具有一组普适性的默认事务属性。使用很方便

1
2
3
4
5
6
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager"
class="org.springframework.jdbc.
datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>

Spring框架提供的各种的好处的唯一前提就是让pojo的类变成受Spring容器管理的Bean。

资源加载机制

Spring 的Resource接口及其实现类可以脱离Spring框架使用,比JDK的资源访问api更加好用.

FileSystemResource,以文件系统的绝对路径的方式进行访问。

ClassPathResource,以类路径的方式进行访问。

ServletContextResource,以相对于web应用根目录的方式进行访问。

资源地址表达式:

clsspath:com/controller/test.java 相对于类的根路径

file:com/controller/test.java 可以是相对路径,也可以是绝对路径

http://www.baidu.com/resource/test.xml 使用UrlResource从Web服务器上获取资源。

ftp://www.baidu.com/resource/test.xml使用UrlResource从FTP服务器上获取资源。

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
String path = "E:/java/abc.txt"; //绝对路径
Resource resource1 = new FileSystemResource(path);
System.out.println("resource1 : "+resource1.getFilename());
File f = new File("text.txt");
System.out.println( f.getCanonicalPath());
System.out.println( f.getAbsolutePath());
Resource resource2 = new FileSystemResource(f);
System.out.println("resource2 : "+resource2.getFilename());
Resource res=new ClassPathResource(
"com/dspsemi/backend/controller/account/file.txt"
);//相对路径
EncodedResource enc=new EncodedResource(res,"UTF-8");
String cont= FileCopyUtils.copyToString( enc.getReader());
System.out.println(cont);
ResourcePatternResolver resolver=new PathMatchingResourcePatternResolver();
​​​Resource resources[]=resolver.getResources(
"classpath*:/com/dspsemi/backend/controller/account/*"
);
for(Resource resource:resources){
​​System.out.println( resource.getFilename());//注意这边的文件后缀.class文件
}
Console:
resource1 : abc.txt
E:\workspace\dining1.0\backend\text.txt
E:\workspace\dining1.0\backend\text.txt
resource2 : text.txt
this is content of file.txt
BillController.class
file.txt
ReconciliationController.class
SourceSystemTest.class
VoucherController.class