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>
详细解决方案
Spring中的事宜管理器(Aspectj)
热度:618 发布时间:2013-11-08 17:51:58.0
相关解决方案
- Spring MVC开发模式,怎么取得新增的id
- spring 表单对象绑定有关问题 String与Long的转换
- spring+quartz定时器有关问题
- spring @Scope("prototype")注解更新有关问题,寻求帮助
- Spring MVC是不是可以完全取代Struts
- spring+quartz的错误,不能正常启动
- spring mvc +ibatis+db2连接数据库的配置如何写啊小弟我链接不下
- spring MVC cvc-complex-type.2.4.c解决方案
- Spring + Mybatis 组合报错
- Spring 中 packagesToScan有关问题
- Spring MVC中点击旋钮没反应
- spring aop这个跳转异常是咋回事
- spring security3的一个小疑点。加急
- spring 事务 aop transactionManager,该怎么解决
- Spring 事务管理,该怎么处理
- 关于 Spring 声明式事务管理!解决办法
- Struts2+Spring+JPA+FREEMARKER 登录程序异常
- 关于 Spring 宣言式事务管理!
- 求SSM分页 struts +spring+mybatis 给小弟我发个学习学习吧 多谢大神们
- spring placeholderConfig的有关问题
- spring 事宜 aop transactionManager
- Spring 事务管理,该怎么解决
- struts2 + spring 整合有关问题
- struts+spring+mybatis出现错误(java.lang.ClassNotFoundException: Entity)为提示位置
- 求解 struts+spring+mybatis sqlsession为空 debug发现没有执行set方法 检查配置好像没有关问题
- 新手求教。spring+axis2集成的有关问题。The endpoint reference (EPR) for the Operation not found
- Spring 和 hibernate如何配置事物
- hibernate与此同时使用多数据源?spring+hibernate
- Spring 动态代理,该怎么解决
- cfx Spring 跟 Spring MVC一起用报错