第一种配置方法:使用@AspectJ标签
在配置文件中添加<aop:aspectj-autoproxy/>注解
创建一个Java文件,使用@Aspect注解修饰该类
创建一个方法,使用@Before、@After、@Around等进行修饰,在注解中写上切入点的表达式
说明:上述Java文件创建好后,需要将其在Spring的容器中进行声明,可以在配置文件中定义<bean/>节点,也可以使用@Component组件进行修饰
示例:
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
/**
* 基于注解的AOP日志示例
* @author ZYWANG 2011-3-24
*/
@Component
@Aspect
public class AopLog {
//方法执行前调用
@Before("execution (* com.zywang.services.impl.*.*(..))")
public void before() {
System.out.println("before");
}
//方法执行后调用
@After("execution (* com.zywang.services.impl.*.*(..))")
public void after() {
System.out.println("after");
}
//方法执行的前后调用
@Around("execution (* com.zywang.services.impl.*.*(..))")
public Object around(ProceedingJoinPoint point) throws Throwable{
System.out.println("begin around");
Object object = point.proceed();
System.out.println("end around");
return object;
}
//方法运行出现异常时调用
@AfterThrowing(pointcut = "execution (* com.zywang.services.impl.*.*(..))",throwing = "ex")
public void afterThrowing(Exception ex){
System.out.println("afterThrowing");
System.out.println(ex);
}
}
上面这段代码中多次使用了重复的切入点,这种情况下,可以使用@Pointcut标注,来修改一个切入点方法(这个方法不需要参数和方法体),然后就可以在@Before等标注中引用该方法作为切入点,示例如下:
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
/**
* 基于注解的AOP日志示例
* @author ZYWANG 2011-3-24
*/
@Component
@Aspect
public class AopLog {
@Pointcut("execution (* com.iflysse.school.services.impl.*.*(..))")
public void pointcut(){}
//方法执行前调用
@Before("pointcut()")
public void before() {
System.out.println("before");
}
//方法执行的前后调用
@Around("pointcut()")
public Object around(ProceedingJoinPoint point) throws Throwable{
System.out.println("begin around");
Object object = point.proceed();
System.out.println("end around");
return object;
}
}
第二种配置方法:基于配置文件的配置
创建一个Java文件,并指定一个用于执行拦截的方法,该方法可以有0个或多个参数
在Spring配置文件中注册该Java类为一个Bean
使用<aop:config/>、<aop:aspect/>等标签进行配置
import org.aspectj.lang.ProceedingJoinPoint;
/**
* 基于配置文件的AOP日志示例
* @author ZYWANG 2011-3-24
*/
public class AopLog {
//方法执行的前后调用
public Object runOnAround(ProceedingJoinPoint point) throws Throwable{
System.out.println("begin around");
Object object = point.proceed();
System.out.println("end around");
return object;
}
}
Spring配置文件
<bean id="aopLog" class="com.iflysse.school.aop.AopLog"></bean>
<aop:config>
<aop:aspect ref="aopLog">
<aop:around method="runOnAround" pointcut="execution (* com.zywang.services.impl.*.*(..))"/>
</aop:aspect>
</aop:config>
注意:上面这个示例使用的是around方式的拦截,该方法要求Java类中的方法有一个ProceedingJoinPoint类型的参数
使用第二种方式的AOP配置,在Eclipse(有SpringIDE插件)中被拦截到的方法中有标识显示
以上配置基于Spring 3.0.5 进行设置,参考其《Reference Documentation》
【转载地址】http://zywang.iteye.com/blog/974226
分享到:
相关推荐
@AspectJ是Spring支持的一种AOP实现,它使用注解来定义切面,简化了配置过程。 创建一个Spring AOP应用的第一步是设置项目结构。在给定的压缩包文件中,我们可能看到一个名为"src"的目录,通常这个目录包含项目的源...
- **Manning.AspectJ.In.Action**:本书由Manning出版社出版,主要介绍AspectJ这一面向切面编程(AOP)语言和技术的应用实践。书名直译为“在行动中的AspectJ”,暗示了本书将通过实例和实战来探讨AspectJ的应用。 ...
**第一种:经典的基于代理的AOP** Spring提供`ProxyFactoryBean`来创建代理对象。你需要实现不同的Advice接口,然后在Spring配置文件中定义切点和通知。例如,你可以使用正则表达式或AspectJ表达式定义切点,并通过`...
2. **配置Spring容器**:在Spring的XML配置文件中启用AOP支持,通过`<aop:config>`标签开启,并可以定义切点(pointcut)和通知(advice)。 3. **定义切点**:使用`<aop:pointcut>`定义要拦截的方法或类。切点...
- 类似于第一种方式,但不使用`TransactionProxyFactoryBean`,而是通过`aop:config`和`aop:pointcut`来定义切入点和通知。 - 示例配置可能会包含`<aop:aspect>`标签。 3. **基于注解的配置方式**: - 最为流行的...
### 第一种:每个Bean都有一个代理 这种方式中,每个需要事务管理的Bean都会有一个对应的代理Bean。`TransactionProxyFactoryBean`用于创建事务代理,它需要设置`transactionManager`和要代理的目标Bean。以下是一...
1. ** annotations增强**:Spring 3大幅增强了对注解的支持,包括@Controller、@RequestMapping、@Service、@Repository等,使得配置文件大大简化,代码更易读。 2. ** RESTful支持**:通过@PathVariable、@Matrix...
3. "ibatis集成spring 声明式事务管理_files" - 这个目录可能包含与第一个HTML文件相关的资源,如图片、样式表或JavaScript文件,帮助解释配置过程。 4. "jpetstore" - 这可能是Spring的示例应用程序JPetStore,它...
- **Lazily-instantiated beans**: 延迟加载Bean,直到第一次请求时才初始化。 - **Autowiring collaborators**: 自动装配协作对象,简化了配置。 - **Checking for dependencies**: 检查Bean是否存在未满足的依赖。...
9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. <tx:advice/> 有关的设置 9.5.6. 使用 @Transactional 9.5.7. 事务传播 9.5.8. 通知事务操作 9.5.9. 结合AspectJ使用 @...
这种可扩展性使得第三方库能够提供与 Spring 配合使用的定制配置,降低了集成成本。 2.3. 面向切面编程(AOP)的提升 2.3.1. 更加简单的 AOP 配置 Spring 2.0 对 AOP 的支持得到了显著加强,简化了配置过程。使用 ...
9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. <tx:advice/> 有关的设置 9.5.6. 使用 @Transactional 9.5.7. 事务传播 9.5.8. 通知事务操作 9.5.9. 结合AspectJ使用 @...
#### 第一课:面向抽象编程 - **定义**:面向抽象编程是一种编程范式,强调通过抽象类或接口来设计程序结构,减少对具体实现的依赖。 - **优势**: - 提高了系统的可维护性与扩展性。 - 降低模块间的耦合度。 - **...
9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. <tx:advice/> 有关的设置 9.5.6. 使用 @Transactional 9.5.7. 插入事务操作 9.5.8. 结合AspectJ使用 @Transactional 9.6. 编程...
1. **依赖注入(Dependency Injection, DI)**:这是Spring最核心的功能之一,通过DI,我们可以将对象之间的依赖关系解耦,提高代码的可测试性和可维护性。在视频中,可能会讲解如何使用@Autowired注解进行自动装配,...
- **历史背景**:Spring项目始于2002年,由Rod Johnson创建,自2004年发布第一个版本以来,不断发展成为当今最受欢迎的企业级Java应用开发框架之一。 - **设计哲学**:强调轻量级、非侵入性以及对POJO的支持,通过...
9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. <tx:advice/> 有关的设置 9.5.6. 使用 @Transactional 9.5.7. 插入事务操作 9.5.8. 结合AspectJ使用 @Transactional 9.6. 编程...
9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. <tx:advice/> 有关的设置 9.5.6. 使用 @Transactional 9.5.6.1. @Transactional 有关的设置 9.5.7. 插入事务操作 9.5.8. 结合AspectJ...
- **AspectJ简介**:AspectJ是一种面向切面编程(AOP)的扩展语言,用于处理横切关注点。 - **使用AspectJ的优点**: - 可以更清晰地管理横切关注点 - 提高代码的可维护性和可读性 - **实现步骤**: - 安装...