- 浏览: 121053 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
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 1497Hibernate.cfg.xml配置文件: Xml ... -
基于Spring的注释的配置
2009-06-18 20:55 2660<?xml version="1.0" ... -
Dwr框架的DWRUtil的理解
2009-06-16 18:41 1536util.js util.js包含了一些使用的方法,从而帮助 ... -
Hibernate的SQL方言
2009-06-16 17:07 1308如果出现如下错误,则可能是Hibernate SQL方言 ... -
JAVA AJAX框架 DWR
2009-06-11 23:40 1959uDWR是什么 Direct Web ... -
基于注释Spring配置
2009-06-10 23:30 1733一:概述注释配置相 ... -
web service
2009-06-05 08:09 1029现在已经进入系统集成阶段 、遗留系统的集成 集成分为:EAI ... -
SSH整合
2009-06-03 00:34 615最近写ssh整合的测试代码时! 很烦的是哪个myclipse ... -
Spring和Hibernate的整合
2009-05-31 21:32 962在Spring 中整合Hibernate的话 在配置文件app ... -
Hibernate的对象--关系映射(2)
2009-05-31 20:06 1223对象与映射关系总结2 ... -
Hibernate查询的总结
2009-05-31 20:04 1246一、hibernate查询 1、测试list和Ite ... -
Spring中的声明式事物
2009-05-31 19:43 1187Nerver : ... -
日志记录Log4j
2009-05-28 08:37 133Log日志:主要用于记录 ... -
Hibernate的inverse和cascade的理解
2009-05-24 19:30 9014. hibernate如何根据pojo来 ... -
Hibernate查询的几个重要理解
2009-05-19 22:32 1184一、hibernate查询 1、测试list和I ... -
Hibernate的对象--关系映射(1)
2009-05-14 00:02 1301... -
Hibernate入门
2009-05-12 18:11 2681、为什么要有hibernate? ... -
Struts中常用的几种Action
2009-05-11 21:04 294除了基本的Action 之外, Struts 还提供了几个其他 ...
相关推荐
在Spring框架中,提供了多种事务管理方式,其中之一就是基于AspectJ的事务控制。本文将深入探讨如何在Spring中利用AspectJ实现事务控制。 首先,我们需要理解什么是AspectJ。AspectJ是一种面向切面编程(AOP)的...
这些切面可以用来封装那些分散在整个应用中的横切关注点,例如日志、事务管理或者安全控制。Spring与AspectJ的集成使得我们可以在Spring应用中充分利用AOP的优势。 AspectJ包含了自己的编译器和类装载器,可以在...
在IT行业中,Spring框架是Java企业级应用开发的首选,其强大的事务管理功能是它的一大亮点。本篇文章将深入探讨Spring事务管理的五种...在实际开发中,结合源码阅读和工具辅助,可以更深入地掌握Spring事务管理的精髓。
在Spring 2.5版本中,面向切面编程(AOP)是一个强大的功能,它允许开发者定义“切面”来封装横切关注点,如日志、事务管理、权限检查等,使得代码更加模块化和可重用。AspectJ是一个成熟的AOP框架,Spring在其AOP...
在给出的标题和描述中,提到了两个重要的JAR文件:"aspectj-1.6.10.jar" 和 "aspectjweaver-1.6.9.jar",这些都是Spring框架中实现AOP事务管理的关键组件。 AspectJ是一个开源的Java语言扩展,专门用于实现面向切面...
### Spring事务与数据库操作 #### 一、Spring的声明式事务管理 在现代软件开发中,事务处理是非常关键的一部分,特别是在涉及多个数据操作时。Spring框架提供了强大的事务管理能力,可以方便地集成到应用程序中。...
AOP(Aspect Oriented Programming,面向切面编程)是一种编程范式,旨在解决程序中的横切关注点,即那些跨越多个类或模块的通用功能,如日志、事务管理等。Spring AOP通过代理模式实现了这一功能,允许开发者定义...
`aspectjweaver.jar`是AspectJ的编织器,AspectJ是一个强大的面向切面编程(AOP)框架,Spring利用AOP实现声明式事务管理。`mysql-connector-java-5.0.8-bin.jar`是MySQL的JDBC驱动,用于连接到MySQL数据库。 在...
切面(Aspect)是关注点的模块化,这些关注点通常是非业务逻辑,如事务管理、日志和安全性。切点(Join Point)是程序执行过程中特定的点,如方法调用、异常处理等。通知(Advice)是在特定切点上执行的代码,它可以...
在AspectJ中,切面(Aspect)是封装了一系列相关横切关注点的模块。这些关注点可以是公共的行为,如事务管理。切面由两部分组成:通知(Advice)和切点(Pointcut)。通知定义了在何时执行特定的行为,而切点定义了...
在IT行业中,Spring框架是Java企业级应用开发的首选,而Spring AOP(面向切面编程)则是其核心特性之一,用于实现横切关注点的模块化,如日志、事务管理等。本实例将带你深入理解并实践Spring AOP与@AspectJ的结合...
在Spring中,我们可以使用AspectJ来实现AOP,AspectJ是一个强大的AOP框架,它可以与Spring无缝集成,提供更细粒度的控制。 首先,让我们了解一下AOP中的通知类型: 1. **前置通知**(Before Advice):在目标方法...
Spring AOP(面向切面编程)是Spring框架的一个重要组成部分,它提供了一种模块化和声明式的方式来处理应用程序中的横切关注点,如日志、事务管理等。在传统的面向对象编程中,这些关注点通常会侵入到业务逻辑中,而...
Spring 声明式事务管理是Spring框架中的一个重要特性,它允许开发者在不编写任何事务管理代码的情况下,通过配置来管理事务。这种方式极大地简化了事务处理,并提高了代码的可维护性。以下是关于Spring声明式事务...
在AspectJ中,一个切面由以下几个部分组成: - **Pointcut(切入点)**:定义了何时应用切面,可以是特定的方法调用、异常抛出或其他事件。 - **Advice(通知)**:在切入点匹配时执行的代码。 - **Introduction...
这样,带有@Transactional注解的类或方法将会自动地被Spring事务代理处理。 3. **编程式事务管理** 编程式事务管理允许在代码中显式地开始、提交、回滚事务。使用PlatformTransactionManager接口的实现,如...
在IT行业中,Spring框架是Java企业级应用开发的首选,而Spring AOP(面向切面编程)则是其核心特性之一,用于实现横切关注点的模块化,如日志、事务管理等。@AspectJ是Spring AOP的一种注解驱动方式,它极大地简化了...
在Spring框架中,事务管理是核心功能之一,它确保了数据操作的一致性和完整性。Spring提供了多种事务管理配置方式,适合不同的应用场景。本篇将详细讲解Spring中的事务管理配置,帮助初学者理解并掌握这一重要概念。...
-- 配置事务管理器 --> <!-- 配置事务属性 --> *">PROPAGATION_REQUIRED,readOnly *">PROPAGATION_REQUIRED,-*Exception <!-- 更多事务属性配置 --> <!-- 需要事务管理的目标对象 --> ``` 这里...