spring自定义切面实例
标题:“spring自定义切面实例” 描述:本文档将深入探讨如何在Spring框架中实现自定义切面(Aspect),并提供具体的代码示例。通过利用Spring的AOP(面向切面编程)特性,特别是@AspectJ注解的支持,我们可以创建灵活、可重用的业务逻辑切面,从而在不修改现有代码的情况下,对应用程序的行为进行增强。 ### Spring自定义切面的核心概念 #### 1. **AOP与@AspectJ支持** Spring框架提供了AOP(面向切面编程)的支持,这使得开发者可以在不修改原有业务逻辑的基础上,添加横切关注点(如日志记录、性能监控等)。而@AspectJ是Spring AOP的一个强大扩展,它允许使用声明式的方式定义切面,简化了AOP的实现过程。 #### 2. **配置AspectJ自动代理** 在Spring配置文件中,可以通过`<aop:aspectj-autoproxy/>`标签启用AspectJ的自动代理功能。这意味着Spring容器会自动为标记了@Aspect注解的类创建AOP代理,而无需手动配置。 #### 3. **自定义注解定义切点** 为了更细粒度地控制切面的介入点,可以自定义注解来定义切点。例如,文档中的`rmpfLog`注解: ```java @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface rmpfLog { String desc() default "信息"; } ``` 此注解用于标记需要被切面增强的方法,并提供了一个默认描述“信息”。 #### 4. **编写切面类** 切面类需要使用`@Aspect`注解进行标记,并包含不同的通知类型(Advice)方法,这些方法将在特定的连接点(Join Point)执行。常见的通知类型包括: - `@Before`:在目标方法执行前调用。 - `@After`:无论目标方法是否抛出异常,都会在方法执行后调用。 - `@AfterReturning`:在目标方法成功返回后调用。 - `@AfterThrowing`:在目标方法抛出异常后调用。 #### 5. **示例代码解析** 文档中给出的切面类示例代码: ```java package com.abchina.rmpf.logmng.aop; // ... 导入必要的包 ... @Aspect public class LogAspect { private ILogService logService; @Autowired public void setLogService(ILogService logService) { this.logService = logService; } // 在方法执行前记录日志 @Before("@annotation(com.abchina.rmpf.logmng.ann.rmpfLog)") public void beforeLog(JoinPoint joinPoint) { // 记录方法调用前的日志信息 } // 在方法执行成功后记录日志 @AfterReturning(pointcut = "@annotation(com.abchina.rmpf.logmng.ann.rmpfLog)", returning = "result") public void afterReturningLog(JoinPoint joinPoint, Object result) { // 记录方法调用后的日志信息,包括返回结果 } // 在方法抛出异常后记录日志 @AfterThrowing(pointcut = "@annotation(com.abchina.rmpf.logmng.ann.rmpfLog)", throwing = "ex") public void afterThrowingLog(JoinPoint joinPoint, Exception ex) { // 记录方法执行时发生的异常 } } ``` 在这个例子中,我们定义了一个名为`LogAspect`的切面类,它包含了三种不同类型的通知方法:`beforeLog`、`afterReturningLog`和`afterThrowingLog`。这些方法分别在方法调用前、调用后和抛出异常后执行,实现了全面的日志记录功能。 ### 总结 Spring框架的AOP功能,尤其是@AspectJ的支持,为开发者提供了强大的工具来实现自定义切面。通过合理的切点定义和切面类设计,我们能够在不侵入业务逻辑的前提下,轻松地添加额外的功能,如日志记录、性能监控等。这不仅提高了代码的可维护性和可读性,还增强了系统的灵活性和可扩展性。
第一步:启用@AspectJ支持。
在你的工程lib目录下添加aspectjweaver.jar和aspectjrt.jar并在spring 的配置文件中添加如下代码:
Xml代码
1.<aop:aspectj-autoproxy/>
<aop:aspectj-autoproxy/> 这一步就完成了@AspectJ的支持,从而可以实现通过注解方式将通知编织到非公共方法中。
第二步:编写自定义注解。实现对方法所实现的功能进行描述,以便在通知中获取描述信息,代码非常简单,如下:
Java代码
1.package com.abchina.rmpf.logmng.ann;
2.
3.import java.lang.annotation.Documented;
4.import java.lang.annotation.ElementType;
5.import java.lang.annotation.Retention;
6.import java.lang.annotation.RetentionPolicy;
7.import java.lang.annotation.Target;
8.
10.@Retention(RetentionPolicy.RUNTIME)
11.@Documented
12.public @interface rmpfLog {
13. String desc() default "无描述信息";
14.}
package com.abchina.rmpf.logmng.ann;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface rmpfLog {
String desc() default "无描述信息";
}
第三步:编写操作日志切面通知实现类。
在编写切面通知实现类之前,我们需要搞清楚我们需要哪些通知类型,是前置通知、后置通知、环绕通知或异常通知?根据我的需求,我们知道我们记录的操作日志有两种情况,一种是操作成功,一种是操作失败。操作成功时则方法肯定已经执行完成,顾我们需要实现一个后置通知;操作失败时则说明方法出现异常无法正常执行完成,顾还需要一个异常通知。因此我们就需要实现这两个通知即可。代码如下:
Java代码
1.package com.abchina.rmpf.logmng.aop;
2.
3.import java.io.File;
4.import java.lang.reflect.Array;
剩余18页未读,继续阅读
- 呆头呆脑dhs2015-07-24值得借鉴与学习
- lpzsoft2014-06-06不管怎样,都感谢楼主
- 「已注销」2018-08-24写得太粗糙了,没有实用借鉴价值
- evil0032014-03-12写得太粗糙了,没有实用借鉴价值
- lubin592012-12-05写的不够细致吧,太粗了,等于没看
- 粉丝: 18
- 资源: 185
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助