AOP系列文章:
Spring AOP:http://ray-yui.iteye.com/blog/2024759
什么是AOP?
AOP是对传统面向对象开发的一种有效的补充,在AOP中概念非常多,请容许笔者省略数千字的概念,只举出一个示例,面向对象中的类就好比是士兵,我们编写每个类就等同于为每个士兵增加装备和训练士兵的体能,从而达到可以上战场打仗的目的,然而有一天AOP这个魔法师出现了,打开了一个魔法门,告诉每个士兵(类),不用再每个士兵单独这样训练了(编码),从我这个魔法门(切面)走过就能增强士兵自身的能力,而这种方式,就是AOP,面向切面编程
AOP的实现方式:
Spring中有AOP的实现,但Spring的AOP更多是借鉴了AspectJ的方式,SpringAOP是基于动态代理的,所以只是方法级别的连接点模型,无法做到例如字段或构造函数的接入点,无法让我们创建更细粒度的通知,若然读者有需要更精确的AOP,请考虑使用AspectJ或JBoss的AOP实现
SpringAOP使用(基于XML)
- package com.accentrix.ray;
- import org.aspectj.lang.ProceedingJoinPoint;
- package com.accentrix.ray;
- import org.aspectj.lang.ProceedingJoinPoint;
- /*
- * 声明切面(Aspect)
- */
- public class Advice {
- // 前置执行方法
- public void beforeMethod() {
- System.out.println("method before execute");
- }
- // 后置执行方法
- public void afterMethod() {
- System.out.println("method after execute");
- }
- // 抛出异常时方法
- public void exceptionMethod() {
- System.out.println("method throw exception execute");
- }
- // 环绕通知
- public void aroundMethod(ProceedingJoinPoint joinPoint) {
- /*
- * 环绕通知就类似Filter,在一个方法中包含开始,执行,结束,抛出异常 ,
- * 甚至可以不调用joinPoint的proceed方法执行真实逻辑 亦可以多次调用
- * ,全由开发者业务逻辑决定
- */
- try {
- System.out.println("before");
- joinPoint.proceed();
- System.out.println("after");
- } catch (Throwable e) {
- e.printStackTrace();
- System.out.println("throw exception");
- }
- }
- // 接受参数通知
- public void hasParamterAfterMethod(String name) {
- System.out.println("before method " + name);
- }
- }
- <!-- 声明Bean -->
- <bean id="advice" class="com.accentrix.ray.Advice" />
- <!-- 配置AOP -->
- <aop:config>
- <!-- 引用注册的Bean ID -->
- <aop:aspect ref="advice">
- <!-- 声明切入点,过滤service下的所有类型和所有方法,不限制参数和返回类型 -->
- <aop:pointcut expression="execution(* com.accentrix.ray.service.*.*(..))"
- id="servicePoincut" />
- <!-- 引用servicePoincut的切入点,调用advice的beforeMethod方法进行前置处理 -->
- <aop:before pointcut-ref="servicePoincut" method="beforeMethod" />
- <!-- 引用servicePoincut的切入点,调用advice的afterMethod方法进行后置处理 -->
- <aop:after pointcut-ref="servicePoincut" method="afterMethod" />
- <!-- 引用servicePoincut的切入点,调用advice的exceptionMethod方法进行异常处理 -->
- <aop:after-throwing pointcut-ref="servicePoincut"
- method="exceptionMethod" />
- <!-- 引用servicePoincut的切入点,调用advice的aroundMethod方法进行环绕处理 -->
- <aop:around pointcut-ref="servicePoincut" method="aroundMethod" />
- <!-- 使用如下pointcut即可为advice传递调用真实业务时传递的参数 -->
- <aop:after
- pointcut="execution(* com.accentrix.ray.service.*.*(String)) and args(name)"
- method="hasParamterAfterMethod" />
- </aop:aspect>
- </aop:config>
SpringAOP基于Annotation方式
- <!-- 需要在applicationContext.xml中增加如下配置 -->
- <aop:aspectj-autoproxy />
- package com.accentrix.ray;
- 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.aspectj.lang.annotation.Pointcut;
- @Aspect
- public class AnnotationAdvice {
- // 声明切入点
- @Pointcut("execution(* com.accentrix.ray.service.*.*(..))")
- public void myPointcut() {
- }
- // 可声明多个切入点
- @Pointcut("execution(* com.accentrix.ray.service.*.*(String) and args(name)")
- public void hasParamterPointcut(String name) {
- }
- // 注解形式前置通知
- @Before("myPointcut()")
- public void beforeMethod() {
- System.out.println("before method execute");
- }
- // 注解形式后置通知
- @After("myPointcut()")
- public void afterMethod() {
- System.out.println("after method execute");
- }
- // 注解形式异常通知
- @AfterThrowing("myPointcut()")
- public void exceptionMethod() {
- System.out.println("method throw exception execute");
- }
- // 注解形式环绕通知
- @Around("myPointcut()")
- public void aroundMethod(ProceedingJoinPoint joinPoint) {
- try {
- System.out.println("before");
- joinPoint.proceed();
- System.out.println("after");
- } catch (Throwable e) {
- e.printStackTrace();
- System.out.println("throw exception");
- }
- }
- // 注解形式传递参数给通知
- @Before("hasParamterPointcut(name)")
- public void hasParamterBeforeMethod(String name) {
- System.out.println("before method execute " + name);
- }
- }
总结:AOP对面向对象的士兵式编程提供了更好的补充,亦在广大的开源框架有显著的效果,例如Spring Security就以AOP为核心,在业务程序开发当中AOP亦到处存在,例如拦截并缓存关于菜单和数据字典的数据,例如声明式事务,而Annotation的出现更加为快速便捷开发提供了很好的支持,从上面两种方式对比就得出Annotation的声明更加简洁方便,所以在业务当中有需要使用自定义的AOP建议采用Annotation的方式,但XML文件的方式亦必须掌握,因为我们时常需要使用到其他框架提供的切面 <!--EndFragment-->
相关推荐
下面将详细介绍Spring AOP的注解方式和XML配置方式。 ### 注解方式 #### 1. 定义切面(Aspect) 在Spring AOP中,切面是包含多个通知(advisors)的类。使用`@Aspect`注解标记切面类,例如: ```java @Aspect ...
在Spring框架中,AOP通过代理实现,可以使用XML配置或注解进行配置。本篇文章主要聚焦于Spring AOP的XML配置通知。 **一、AOP概念解析** 1. **切面(Aspect)**:一个关注点的模块化,例如事务管理就是一个切面。...
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是...在`myaop`项目中,你可以找到具体的示例代码,包括切面类、切入点表达式以及相应的注解使用,通过这些示例可以更深入地理解Spring AOP的注解配置。
Spring AOP主要通过两种方式实现:XML配置和注解。本实例主要探讨的是使用XML配置的方式来实现AOP。XML配置虽然相比注解方式略显繁琐,但它提供了更大的灵活性,尤其是在需要对多个类或方法应用相同通知(Advice)时...
**Spring AOP 管理XML版详解** 在Spring框架中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种重要的设计模式,它扩展了传统的面向对象编程(OOP),使得我们可以将关注点分离,特别是那些横切关注...
本篇将深入讲解如何通过注解来配置Spring AOP,以实现更加简洁、高效的代码编写。 首先,我们来看注解在Spring AOP中的应用。在传统的AOP配置中,我们需要定义切入点表达式和通知(advice)在XML配置文件中。然而,...
在Spring中,我们通常使用基于注解的AOP,它简化了配置并使代码更易读。 二、注解驱动的AOP 1. 定义切面(Aspect):首先,我们需要创建一个切面类,这个类通常包含通知(Advice),也就是实际的日志记录方法。使用...
在使用Spring AOP时,我们可以通过XML配置或注解的方式来定义切面。例如,可以使用`@Aspect`注解定义一个切面类,`@Before`、`@After`等注解来声明通知,`@Pointcut`定义切点表达式。 在实际开发中,Spring AOP广泛...
Spring支持两种AOP的实现方式:Spring AspectJ注解风格和Spring XML配置风格。使用AspectJ注解风格是最常见的,它允许开发者直接在方法上使用注解来定义切面。 Spring AOP中有五种不同类型的的通知(Advice): 1....
这里我们将深入探讨两种在Spring中实现AOP的方式:XML配置和注解配置。 首先,让我们来看看**XML配置AOP**。在Spring的早期版本中,XML配置是主要的配置方式。在`spring-aop-xml`中,你可能会看到以下关键元素: 1...
XML配置是Spring AOP早期版本中主要的配置方式,虽然在Spring 4.x及以后版本中,基于注解的配置更加常见,但理解XML配置仍然是学习AOP的基础。 首先,我们需要了解AOP的基本概念: 1. 切面(Aspect):一个关注点的...
Spring AOP,全称为Aspect-Oriented Programming,是Spring框架中的一个重要模块,它引入了面向切面编程的概念,使得开发者可以更加...学习并掌握Spring AOP的注解使用,对于提升开发效率和代码质量有着显著的帮助。
在Spring XML配置中,我们可以使用`<aop:config>`元素来定义切点表达式,然后使用`<aop:aspect>`元素来声明切面,并将通知方法与切点关联起来。此外,还可以使用注解驱动的配置,通过`@EnableAspectJAutoProxy`注解...
总结一下,通过上述步骤,我们已经在Spring Boot应用中利用Spring AOP和注解方式实现了数据脱敏。这个拦截器可以在不修改原有业务代码的情况下,确保敏感信息在响应给客户端之前得到处理,提高了应用的安全性。同时...
现在,我们回到主题——"springaop依赖的jar包"。在Spring 2.5.6版本中,使用Spring AOP通常需要以下核心jar包: - `spring-aop.jar`:这是Spring AOP的核心库,包含了AOP相关的类和接口。 - `spring-beans.jar`:...
在本实例中,我们将深入探讨如何使用XML和注解结合的方式来配置Spring框架。首先,我们先来理解每个文件的作用。 1. **Maven配置文件pom.xml** Maven是一个项目管理工具,通过pom.xml文件来管理项目的构建、依赖和...
要使用Spring AOP,通常需要引入以下几个核心的Jar包: 1. **aspectj-1.7.3.jar**:这是AspectJ库的核心部分,提供了AOP语言支持,包括AspectJ编译器和运行时库。AspectJ是Java平台上的一个开源项目,它扩展了Java...
通过以上步骤,我们就成功地使用XML配置完成了Spring AOP的开发。这种方式虽然相对繁琐,但它清晰地展示了AOP的各个组成部分,有利于理解和学习。然而,在实际开发中,更常见的是使用注解驱动的AOP,因为其更简洁且...
本篇我们将深入探讨如何使用注解的方式来实现Spring AOP开发。 ### 一、注解基础 在Spring AOP中,主要使用以下几种注解: 1. `@Aspect`:定义一个切面类,切面是AOP的核心,包含通知(advisors)和切点...
在Spring AOP中,我们主要使用以下注解: 1. `@Aspect`:标记一个类为切面,这个类将包含切点和通知。 2. `@Before`:前置通知,方法会在目标方法执行前被调用。 3. `@After`:后置通知,无论目标方法是否正常执行...