之前我们有讲过代理模式和动态代理,其实在Spring中的AOP就是一种动态代理的体现。今天我们的话题就是Spring中的代理模式-AOP。
什么是AOP呢?AOP为Aspect Oriented Programming的缩写,意为:面向切面编程(也叫面向方面),可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。
他的好处很多,比如说有人说他可以让我们
减少很多重复代码,例如,我们的日志类,专用于写日志,但是很多日志都是相同的,方法开始,方法结束,方法异常,等等等等。AOP能够很轻松实现切面介入,只需要写一个方法,可以在所有需要用到的地方加入该切面类来做日志。他还有一个很大的优点,就是它极大的
降低了程序的耦合度。不管日志,还是开关数据库,都不是我这个业务本该有的东西,只能说是辅助方法而已。而将这些辅助方法写在切面类中,可以降低程序的耦合度,让对象类保持了他该有的一个完整性。
我们今天的话题是,怎样用Annotation实现Spring的AOP。首先,我们需要在Spring的配置文件里加入这么一段话:
<aop:aspectj-autoproxy />
这样,Spring框架就支持aspectj了。了解的童鞋都知道,aspect是方面编程的jar包。所以我们还需要在项目中导入aspectjrt-1.2.jar和aspectjweaver-1.6.2.jar这两个包,第一个包顾名思义,是aspectj的runtime,即运行所需的包。第二个包是我们开发需要的包,weaver是编织者的意思,这里的意思即将切面方法织入我们的对象中。这里提供了maven导入两个包的配置,在pom.xml中加入下面这段依赖:
<dependency>
<groupId>aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.2</version>
<optional>true</optional>
</dependency>
前期工作准备就绪,我们用下面简单的几个代码,让大家看看使用Annotation来配置AOP的方便快捷。
@Aspect
@Component
public class LogInterceptor {
@Pointcut("execution(public void com.tang.service.*.*(..))")
public void gogog(){};
@Before("gogog()")
public void Before(){
System.out.println("Before execute any of public method");
}
@Around("gogog()")
public void Around(ProceedingJoinPoint jp) throws Throwable{
System.out.println("before around");
jp.proceed();
System.out.println("after around");
}
}
上面这段代码,就将我com.tang.service这个包下面的所有类的所有public,返回值是void的方法加上了这个日志连拦截器。首先我们看@Aspect标签,表明了这个类就是一个切面类。@Component标签是表示我把这个类也配置进容器来管理。在将AOP的这里意义不大,可以忽略,要提醒大家的是,切面类必须要配置到容器管理,否则是无效的。
@Pointcut("execution(public void com.tang.service.*.*(..))")这句话其实是定义了一个织入点,准确点说,就是定义了一个切入标准,这个标准内的写法就是"execution(public void com.tang.service.*.*(..))",execution是必须写的关键字,表示这是一个入点语法。public不用解释了,void可以换成其他返回值,或者是*号来表示支持所有返回值的类。空格之后是包名点类名点方法名,这里我只写了包名,类名用*表示该包下面所有类,方法名也用*表示所有方法。后面(..)是表示所支持的传参是所有类型参数。
我们定义了一个Pointcut后,需要将其发放给一个方法名,public void gogog(){};这句话定义了一个空方法,就是用来接受这个Pointcut的。这时候就能在需要切入的方法上配置了。@Before("gogog()")和@Around("gogog()")都是配置一个advice,这个advice可以表明他是在哪里运行这个类,Before顾名思义是在方法运行前。Around表示了方法执行前后都要插入。还有Afterreturnning表示当正常返回后执行。还有After表示在方法执行完毕后一定会执行, 跟我们写finnally里面执行一样。其他的advice大家可以参考Spring官方的文档,这里就不描述了。
advice后面括号中的就是我们之前Pointcut定义的那个类,其实这个括号内也可自己写一个织入点语法。如果该切面方法是很特殊的专门用于某个特定方法的切面方法,那么你可以自己再这里定义一个织入点语法。否则建议使用Pointcut来定义织入点,方便其他切面方法复用,详细解释一下上面是如何实现切面的:
//这里使用了gogog()的织入点(gogog()织入点之前的pointcut定义过了)
@Before("gogog()")
//Before表示方法执行前,该织入点方法执行前,执行下面这个Before方法(方法名可以换)
public void Before(){
System.out.println("Before execute any of public method");
}
//Around很特殊,他所标注的方法需要有个ProceedingJoinPoint参数。而ProceedingJoinPoint.proceed()方法表示我执行原方法,然后我们就能轻松在元方法前后加入自己需要加入的逻辑了。这里前后的逻辑均为打印
@Around("gogog()")
public void Around(ProceedingJoinPoint jp) throws Throwable{
System.out.println("before around");
jp.proceed();
System.out.println("after around");
}
以上就实现了AOP,我们来看调用代码
public static void main(String[] args) {
FileSystemXmlApplicationContext context
= new FileSystemXmlApplicationContext("/WebRoot/WEB-INF/applicationContext.xml");
UserService service = (UserService) context.getBean("userService");
User user = new User();
service.addUser(user);
service.deleteUser(user);
}
代码中看不出来任何多余的代码,根本不知道是否使用过AOP是吧。其实service的addUser()和deleteUser()方法都是被注解为需要做Before拦截和Around拦截的方法。所以执行这两个方法,势必会执行AOP里面的拦截方法。很给力的注解实现AOP吧。
分享到:
相关推荐
在本资料"Spring_Annotation_AOP"中,我们将深入探讨Spring框架如何利用注解实现AOP,以及其背后的原理和实践应用。 面向切面编程(AOP)是一种编程范式,旨在提高代码的可维护性和可重用性,通过将关注点分离,...
本实例将详细探讨如何通过注解(Annotation)来实现Spring AOP的方法拦截。 一、Spring AOP基础 Spring AOP是Spring框架的一部分,它提供了一种在运行时织入横切关注点(如日志、事务管理等)到目标对象的能力。AOP...
这篇“学习Spring笔记_AOP_Annotation实现和XML实现”主要探讨了如何在Spring中利用注解和XML配置来实现AOP的概念。 AOP,全称Aspect-Oriented Programming,是一种编程范式,旨在将关注点分离,让开发者可以更专注...
在本篇文章中,我们将深入探讨基于Annotation的AOP实现,特别是动态代理的理念。 首先,了解什么是AOP。AOP的核心概念是“切面”(Aspect),它封装了跨越多个对象的行为或责任。切面可以包含通知(Advice)、切点...
综上所述,SpringBoot结合AspectJ实现SpringAOP拦截指定方法,主要涉及到Spring AOP的原理、切点和通知的定义、自定义注解的使用,以及如何在SpringBoot项目中整合AspectJ进行更复杂的切面编程。通过这些知识点,...
Spring mvc Aop+annotation实现系统日志记录功能实现的jar包asm-3.3.jar ,aspectjrt.jar , aspectjweaver.jar , cglib-nodep-2.1_3.jar , spring-aop.jar
4. **启用AOP代理**:为了让Spring能够识别并处理切面,我们需要在配置中启用AOP代理。在Spring XML配置文件中,这可以通过添加`<aop:aspectj-autoproxy/>`元素完成;在Java配置中,可以使用`@...
在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者将关注点从业务逻辑中分离出来,比如日志记录、事务管理、权限检查等。Spring 2.0引入了基于注解的AOP配置,极大地简化了AOP的使用。这篇...
1. **启用AOP代理**:在Spring配置文件中,我们需要开启基于注解的AOP支持。如果使用XML配置,可以添加`<aop:aspectj-autoproxy>`元素;如果是Java配置,可以通过`@EnableAspectJAutoProxy`注解来启用。 2. **定义...
Spring提供了两种主要的AOP实现方式:基于代理(Proxy-based)和基于注解(Annotation-based)。 - **基于代理的AOP**:Spring使用JDK动态代理或CGLIB动态代理创建目标对象的代理,代理对象在调用目标方法前后执行...
在Spring框架中,AOP(面向切面编程)是一种强大的工具,它允许程序员在不修改原有代码的情况下,插入新的功能或行为。在Spring 3.0.5版本中,Spring扩展了对AOP的支持,特别是在处理HTTP响应时,可以通过AOP来获取`...
NULL 博文链接:https://tianhei.iteye.com/blog/978969
在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者定义“切面”,这些切面封装了关注点,如日志、事务管理或性能度量,从而将它们与业务逻辑分离。AspectJ是Java平台的一个开源项目,提供了...
在Spring框架中,自定义注解(Annotation)和AOP(面向切面编程)的结合使用,极大地增强了代码的可读性和可维护性。本文将深入探讨如何在Spring中创建自定义注解以及如何在AOP中有效地获取并利用这些注解。 首先,...
### Spring中的AOP不生效的原因及解决方法 在Java开发中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种重要的编程思想和技术手段,主要用于处理横切关注点问题,如日志记录、性能统计、安全控制、...
在Spring AOP中,切面主要通过两种方式实现:代理(Proxies)和织入(Weaving)。 1. **代理**:Spring AOP支持两种类型的代理:JDK动态代理和CGLIB代理。JDK代理用于实现了接口的类,而CGLIB代理则用于没有接口或...
以下是使用JDK动态代理实现Spring AOP的步骤: 1. **定义切面(Aspect)**:切面是AOP的核心,它封装了横切关注点。在Spring中,可以通过实现`org.aspectj.lang.annotation.Aspect`接口或者使用注解`@Aspect`来定义...
总结一下,通过上述步骤,我们已经在Spring Boot应用中利用Spring AOP和注解方式实现了数据脱敏。这个拦截器可以在不修改原有业务代码的情况下,确保敏感信息在响应给客户端之前得到处理,提高了应用的安全性。同时...
在Spring中,AOP通过代理模式实现,可以分为JDK动态代理和CGLIB代理两种方式。 1. **AOP概念** - **切面(Aspect)**:切面是关注点的模块化,比如日志、安全检查等,它将分散在代码各处的相同关注点集中在一起。 ...