springc aop
时间: 2024-12-31 11:26:49 浏览: 14
### 关于Spring框架中的AOP
#### 面向切面编程概述
面向切面编程(AOP)是一种编程范式,旨在通过程序化方式处理横切关注点。这些关注点跨越多个模块并影响整个应用程序的功能,如日志记录、事务管理等[^2]。
#### Spring AOP核心概念
在Spring中实现AOP主要依赖几个关键术语:
- **Advice(通知)**:这是指拦截到连接点之后要执行的动作。它分为前置通知(Before advice),返回后置通知(After returning advice), 抛异常后置通知(After throwing advice),最终后置通知(After (finally) advice) 和环绕通知(Around advice)[^1]。
- **Pointcut(切入点表达式)**:用于定义哪些Join points应该被织入advice。可以基于方法名称、参数列表等多种条件来指定目标join point集合。
- **Aspect(方面/切面)**:通常是一个类,包含了pointcuts和advices的组合体,在这个上下文中实现了特定功能逻辑[^3]。
- **Joint Points(连接点)**:指的是应用运行过程中的具体位置,比如某个方法调用前或抛出异常时等时刻。Spring AOP仅支持Method execution join points。
- **Weaving(织入)**:是指把aspect与其他对象链接起来,并创建新的代理实例的过程。可以在编译期、加载期间或者运行时期完成这一操作。
#### 实现自定义注解的例子
下面展示了一个简单的例子,说明如何利用Spring AOP创建一个自定义的日志记录器[@Logging]:
```java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Logging {
String value() default "Executing method";
}
```
接着编写相应的`Aspect`:
```java
@Component
@Aspect
public class LogginAspect {
private static final Logger logger = LoggerFactory.getLogger(LogginAspect.class);
@Before("@annotation(com.example.Logging)")
public void logExecution(JoinPoint joinPoint){
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Object[] args = joinPoint.getArgs();
StringBuilder sb = new StringBuilder(signature.getName()).append("(");
Arrays.stream(args).forEach(arg -> sb.append(arg.toString()).append(", "));
sb.setLength(sb.length()-2); // Remove last comma and space
sb.append(")");
logger.info("{}",sb.toString());
}
}
```
最后只需简单地将此注解应用于任何希望监控的方法上即可生效:
```java
@Service
public class MyService{
@Logging(value="Calling my special service operation")
public void doSomething(){
System.out.println("Doing something...");
}
}
```
阅读全文