1 使用Annotation方式
spring依赖库
* SPRING_HOME/dist/spring.jar
* SPRING_HOME/lib/jakarta-commons/commons-logging.jar
* SPRING_HOME/lib/log4j/log4j-1.2.14.jar
* SPRING_HOME/lib/aspectj/*.jar
使用Aspect定义切入点
package com.travelsky.aop.aspect;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.AfterReturning;
@Aspect
public class serviceAspect {
@Pointcut("execution(* com.travelsky.service..*.*(..))")
public void doBeforeService() {
}
@Pointcut("execution(* com.travelsky.service..*.*(..))")
public void doAfterService() {
}
}
定义advice
package com.travelsky.aop.advice;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class serviceAdvice{
@Before("com.travelsky.aop.aspect.serviceAspect.doBeforeService()")
public void doAccessCheck() {
// ...
System.out.println("Aop: do before service.");
}
@AfterReturning("com.travelsky.aop.aspect.serviceAspect.doAfterService()")
public void logInfo() {
// ...
System.out.println("Aop: do after service");
}
}
在Spring配置文件applicationContext.xml中配置
<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"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"
default-autowire="byName" default-lazy-init="true">
<aop:aspectj-autoproxy />
<bean class="com.travelsky.aop.advice.serviceAdvice" />
</bean>
2 配置文件方式
spring依赖库
* SPRING_HOME/dist/spring.jar
* SPRING_HOME/lib/jakarta-commons/commons-logging.jar
* SPRING_HOME/lib/log4j/log4j-1.2.14.jar
* SPRING_HOME/lib/aspectj/*.jar
在applicationContext.xml中配置
<aop:config>
<!-- 被切入的切面类-->
<aop:aspect id="security" ref="securityHandler">
<!-- 要切入的点(针对哪个切入。表达式方法声明匹配被切入的类及其方法) -->
<aop:pointcut id="allAddMethod" expression="execution(* com.travelsky.security.UserManagerImpl.add*(..))"/>
<!-- 声明切面类的要切入方法及具体位置 -->
<aop:before method="checkSecurity" pointcut-ref="allAddMethod"/>
</aop:aspect>
</aop:config>
3 给出一个生产中实际使用的AspectJ管理AOP事物的配置文件(配置方式实现)
<?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"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"
default-autowire="byName" default-lazy-init="true">
<!-- 属性文件读入 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath*:config.properties</value>
</list>
</property>
</bean>
<!-- 支持 @Transactional 标记 -->
<tx:annotation-driven />
<!-- 支持 @AspectJ 标记-->
<aop:aspectj-autoproxy proxy-target-class="true"/>
<!-- 以AspectJ方式 定义 AOP -->
<aop:config proxy-target-class="true">
<aop:advisor
pointcut="execution(* com.travelsky.bravo.components..*Manager.*(..))"
advice-ref="txAdvice" />
<aop:advisor
pointcut="execution(* com.travelsky.bravo.core..*Manager.*(..))"
advice-ref="txAdvice" />
<aop:advisor
pointcut="execution(* com.travelsky.bravo.core.dao..*DaoImpl.*(..))"
advice-ref="txAdvice" />
<aop:advisor
pointcut="execution(* com.travelsky.bravo.core.dao..*Dao.*(..))"
advice-ref="txAdvice" />
<aop:advisor
pointcut="execution(* com.travelsky.agentsky..*Manager.*(..))"
advice-ref="txAdvice" />
<aop:advisor
pointcut="execution(* com.travelsky.agentsky.ws..*AgentSkyWS4GF.*(..))"
advice-ref="txAdvice" />
</aop:config>
<!-- 基本事务定义,使用transactionManager作事务管理,默认get*方法的事务为readonly,
数据操作方法事物为rollback 其余方法按默认设置. -->
<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="get*" read-only="true" />
<tx:method name="find*" read-only="true" />
<tx:method name="save*" rollback-for="Exception"/>
<tx:method name="insert*" rollback-for="Exception" />
<tx:method name="remove*" rollback-for="Exception"/>
<tx:method name="add*" no-rollback-for="Exception" />
<tx:method name="*" />
</tx:attributes>
</tx:advice>
</beans>
分享到:
相关推荐
5. **声明式事物管理**:在Spring框架中,AspectJ可以用来实现声明式事务管理。通过在切面中定义事务边界,可以确保在出现异常时自动回滚事务,无需在业务代码中显式处理。 6. **AspectJ的使用**:使用AspectJ通常...
`aspectjweaver.jar`是AspectJ库的一个组成部分,它在SSM中的主要作用是实现AOP(面向切面编程)来处理事务。本文将详细讲解SSM框架中事务管理的概念、AspectJ的作用以及`aspectjweaver.jar`在事务管理中的应用。 1...
- 使用`<aop:aspectj-autoproxy>`启用对`@AspectJ`注解的支持,这是Spring AOP(面向切面编程)的一部分,允许我们在代码中定义切面,以实现如日志记录、事务处理等通用功能。 6. **整合流程** - 创建Action类...
这可以是基于代理的(JDK或CGLIB代理)或基于AspectJ的AOP实现。 5. **@Transactional注解**:这是声明式事务管理的关键,可以在方法上使用,表示该方法应该在一个事务内运行。注解可以指定事务属性,如隔离级别、...
这种方式会自动为带有`@Transactional`注解的方法创建AspectJ代理,无需额外的`aop:config`。 综上所述,Spring提供了灵活多样的事务管理配置方式,可以根据项目需求选择适合的方案。理解并熟练运用这些配置,将有...
3. **代理机制**:Spring通过代理机制实现事务控制,包括AOP(面向切面编程)代理和JDK动态代理。代理机制是决定事务策略的关键部分,它决定了事务如何在方法调用间传播。 接下来,我们将详述Spring配置事务的五种...
- **AspectJ切入点语法**:Spring AOP支持基于AspectJ切入点表达式语言来定义切点。 ### 资源管理 Spring的资源抽象使得访问不同类型的资源变得容易,如文件系统、类路径或者URL等。 - **Resource接口**:定义了...
1.spring-aop:面向切面AOP编程中需要使用。声明式事物也用到此包。 2.spring-aspects:提供对AspectJ的支持,以便可以方便的将面向方面的功能集成进IDE中,比如Eclipse AJDT。 3.spring-beans:基础jar包,它包含...
- AspectJ:Spring支持AspectJ注解和切面,进一步增强AOP功能。 - 自动装配(Auto-Wiring):Spring容器可以自动检测和配置Bean之间的依赖关系。 - 静态工厂方法和实例工厂方法:Spring允许使用工厂方法创建Bean...