- 浏览: 118527 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
liguocai2009:
liguocai2009 写道经过我我的测试,600万的数据, ...
Oracle row_number() over()解析函数高效实现分页 -
liguocai2009:
经过我我的测试,600万的数据,row_number()耗时4 ...
Oracle row_number() over()解析函数高效实现分页 -
学会做人:
lbs1988 写道扯淡 谁说row_number() ove ...
Oracle row_number() over()解析函数高效实现分页 -
lbs1988:
扯淡 谁说row_number() over 效率高 他们效率 ...
Oracle row_number() over()解析函数高效实现分页 -
id0096:
没觉得效率高到哪里去...用180W条数据测试,很多情况下没有 ...
Oracle row_number() over()解析函数高效实现分页
Spring 的AOP确实强大!
但是AOP在实际的工作运用中,无外乎就是权限的验证(当然动态代理模式也可以轻松实现)!日志的处理!
但用的最多的还是事务的管理!
而在Spring中的事务管理又分为:A、编程式事物处理
优点:可以精确的控制事物的边界
缺点是:实现不是很优雅!因为在每一个需事务管理的业务逻辑中都需要调用
TransactionTemplate 的execute()方 法,导致了业务逻辑和系统业务的交叉!
B、声明式事物:采用了AOP优雅的解决了编程式事物的缺点
(在中小型项目中用A比较好,事物处理比较单一;大型项目,事物处理比较多的话,用B比较好)
而我们其实在工作中利用注解的方式还要简单些!所以我利用Aspectj加AOP也解决了编程式事物处理的缺点!
以下是我的测试案例
步骤: 1、配置Spring 的Datasource ,TransactionManager,TransactionTemplate
2、定义标注@interface
3、定义Aspect(@Aspect,@around),定义切入点
4、在Spring中配置Aspect就是配置一个简单ben
****************************************************************
package com.lovo.annotation;
public class AService {
public void createBook(){
System.out.println("@@@@@@@@@@@");
}
public static void main(String[] args) {
AService a = (AService)SpringUtil.getContext().getBean("a");
a.createBook();
}
}
*****************************************************************************
package com.lovo.annotation;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;
/**
* 增加书的业务操作方法
* @author Administrator
*
*/
public class BookService {
//事物模板
private TransactionTemplate trans;
//数据源
private DataSource dataSource;
public TransactionTemplate getTrans() {
return trans;
}
public void setTrans(TransactionTemplate trans) {
this.trans = trans;
}
public DataSource getDataSource() {
return dataSource;
}
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
//添加事物属性值
@Trans(TransactionTemplate.PROPAGATION_REQUIRED)
/**
* 业务方法
*/
public void createBook(){
//创建jdbc模板
JdbcTemplate jdbc = new JdbcTemplate(dataSource);
//执行插入数据库操作
jdbc.update("insert into T_BOOK values(5522,'Spring3 in Action',3)");
}
}
*******************************************************************************
package com.lovo.annotation;
/**
* 测试类
* @author Administrator
*
*/
public class Client {
public static void main(String[] args) {
BookService bookServ = (BookService)SpringUtil.getContext().getBean("bookService");
bookServ.createBook();
}
}
*************************************************************************
package com.lovo.annotation;
/**
* 定义一个注释类
*/
import java.lang.annotation.Target;
import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.ElementType;
@Target({ElementType.METHOD})
@Retention(RUNTIME)
public @interface Trans {
int value();
}
**********************************************************************
package com.lovo.annotation;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 定义一个加载配置文件的单例工具类。
*
* @author Administrator
*
*/
public class SpringUtil {
private SpringUtil(){
}
private static ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
public static ApplicationContext getContext(){
return context;
}
}
**************************************************************
package com.lovo.annotation;
import java.lang.reflect.Method;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;
@Aspect
public class TransactionAspect {
// 拦截对目标对象方法调用
@Around("execution(@com.lovo.annotation.Trans * *.*(..))")
public Object inTransaction(final ProceedingJoinPoint pjp) {
//获得事物模板
TransactionTemplate trans = (TransactionTemplate)SpringUtil.getContext().getBean("transactionTemplate");
// 获取连接点的方法签名对象
MethodSignature sig = (MethodSignature) pjp.getSignature();
// 连接点对象的方法
Method method = sig.getMethod();
// 返回@trans的注释对象
Trans antrans = (Trans) method.getAnnotation(Trans.class);
//设定事物的属性值
trans.setPropagationBehavior(antrans.value());
//执行事务的方法
return trans.execute(new TransactionCallback(){
public Object doInTransaction(TransactionStatus ts) {
Object result = null;
try {
result=pjp.proceed();
} catch (Throwable e) {
ts.setRollbackOnly();
e.printStackTrace();
}
return result;
}
});
}
}
***************************************************************************
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation=
"http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref local="dataSource"/>
</property>
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>oracle.jdbc.driver.OracleDriver</value>
</property>
<property name="url">
<value>jdbc:oracle:thin:@localhost:1521:ORCL</value>
</property>
<property name="username"><value>scott</value></property>
<property name="password"><value>wl</value></property>
</bean>
<bean id="bookService" class="com.lovo.annotation.BookService">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="trans">
<ref bean="transactionTemplate"/>
</property>
</bean>
<bean id="transAspect" class="com.lovo.annotation.TransactionAspect"></bean>
</beans>
- SpringDB2.rar (6.4 MB)
- 下载次数: 67
- spring2.5_aspect_jar.rar (5 MB)
- 下载次数: 77
发表评论
-
hibernate的主键生成策略
2009-06-22 17:52 1461Hibernate.cfg.xml配置文件: Xml ... -
基于Spring的注释的配置
2009-06-18 20:55 2630<?xml version="1.0" ... -
Dwr框架的DWRUtil的理解
2009-06-16 18:41 1504util.js util.js包含了一些使用的方法,从而帮助 ... -
Hibernate的SQL方言
2009-06-16 17:07 1247如果出现如下错误,则可能是Hibernate SQL方言 ... -
JAVA AJAX框架 DWR
2009-06-11 23:40 1899uDWR是什么 Direct Web ... -
基于注释Spring配置
2009-06-10 23:30 1708一:概述注释配置相 ... -
web service
2009-06-05 08:09 977现在已经进入系统集成阶段 、遗留系统的集成 集成分为:EAI ... -
SSH整合
2009-06-03 00:34 615最近写ssh整合的测试代码时! 很烦的是哪个myclipse ... -
Spring和Hibernate的整合
2009-05-31 21:32 936在Spring 中整合Hibernate的话 在配置文件app ... -
Hibernate的对象--关系映射(2)
2009-05-31 20:06 1195对象与映射关系总结2 ... -
Hibernate查询的总结
2009-05-31 20:04 1188一、hibernate查询 1、测试list和Ite ... -
Spring中的声明式事物
2009-05-31 19:43 1127Nerver : ... -
日志记录Log4j
2009-05-28 08:37 133Log日志:主要用于记录 ... -
Hibernate的inverse和cascade的理解
2009-05-24 19:30 8744. hibernate如何根据pojo来 ... -
Hibernate查询的几个重要理解
2009-05-19 22:32 1135一、hibernate查询 1、测试list和I ... -
Hibernate的对象--关系映射(1)
2009-05-14 00:02 1255... -
Hibernate入门
2009-05-12 18:11 2681、为什么要有hibernate? ... -
Struts中常用的几种Action
2009-05-11 21:04 294除了基本的Action 之外, Struts 还提供了几个其他 ...
相关推荐
spring通过aspectj来实现事务控制
博文链接:https://log-cd.iteye.com/blog/213445
spring事务管理几种方式代码实例:涉及编程式事务,声明式事务之拦截器代理方式、AOP切面通知方式、AspectJ注解方式,通过不同方式实例代码展现,总结spring事务管理的一般规律,从宏观上加深理解spring事务管理特性...
Spring框架的事务管理之基于AspectJ的XML方式.Spring框架的事务管理之基于AspectJ的注解方式
Spring将事务管理分成了两类: * 编程式事务管理 * 手动编写代码进行事务管理.(很少使用) * 声明式事务管理: * 基于TransactionProxyFactoryBean的方式.(很少使用) * 需要为每个进行事务管理的类,配置一个...
aspectj-1.6.10.jar,aspectjweaver-1.6.9.jar,spring3.+事务所用到的jar
1. 基于Aspectj实现动态数据源...6. 实现事务内切换数据源(支持原生Spring声明式事务哟,仅此一家),并支持多数据源事务回滚(有了它除了跨服务的事务你需要考虑分布式事务,其他都不需要,极大的减少了系统的复杂程度)
注意:只是jdbc自带的jdbctample,不能 用于整合mybatis框架的事务,我整合了,事务不起作用!!!! 按老师的说法是基于xml方式,但不准确,因为也用到了注解 <aop:aspectj-autoproxy proxy-target-class="true">...
6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.1.1. @Configurable object的单元测试 6.8.1.2. 多application context情况下的处理 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来...
6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7...
1.1 Spring事务处理时自我调用的解决方案及一些实现方式的风险 1.2 我对AOP的理解 1.3 Spring开闭原则的表现-BeanPostProcessor的扩展点-1 1.4 我对IoC/DI的理解 1.5 SpringMVC + spring3.1.1 + hibernate4.1.0 集成...
22.Spring集成的jdbc编码和事务管理 23.使用Spring注解方式管理事务与传播行为详解 24.使用Spring配置文件实现事务管理 25.搭建和配置Spring与Hibernate整合的环境 26.Spring集成的Hibernate编码与测试 27....
第8章 Spring中的事务管理 第9章 Spring对ORM的支持 第10章 Spring MVC框架 第11章 整合Spring与其他Web框架 第12章 Spring对测试的支持 第三部分 高级主题 第13章 Spring ...
第8章 Spring中的事务管理 第9章 Spring对ORM的支持 第10章 Spring MVC框架 第11章 整合Spring与其他Web框架 第12章 Spring对测试的支持 第三部分 高级主题 第13章 Spring ...
6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ Load-time weaving(LTW) 6.9. ...
第10章:对实际应用中Spring事务管理各种疑难问题进行透彻的剖析,让读者对Spring事务管理不再有云遮雾罩的感觉。 第11章:讲解了如何使用Spring JDBC进行数据访问操作,我们还重点讲述了LOB字段处理、主键产生...
内含有mybatis 拦截器实现的分页代码,spring 的事务和aop 测试、和反射工具类