您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Spring中的切面是怎样实现的
## 1. 什么是AOP
面向切面编程(Aspect-Oriented Programming,AOP)是Spring框架的核心功能之一,它通过**横向切割**业务逻辑,将**横切关注点**(如日志、事务、安全等)与核心业务逻辑分离。AOP通过动态代理技术实现,在不修改原始代码的情况下增强功能。
## 2. Spring AOP的实现原理
Spring AOP主要通过以下两种代理方式实现:
### 2.1 JDK动态代理
- **适用场景**:目标类实现了接口
- **实现机制**:
```java
Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler(){...}
);
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(new MethodInterceptor(){...});
通过@Aspect
注解声明:
@Aspect
@Component
public class LogAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBefore(JoinPoint jp) {
System.out.println("方法执行前:" + jp.getSignature());
}
}
表示程序执行过程中的特定点(如方法调用、异常抛出等)
通知类型 | 注解 | 执行时机 |
---|---|---|
前置通知 | @Before | 目标方法执行前 |
后置通知 | @After | 方法执行后(无论成败) |
返回通知 | @AfterReturning | 方法成功返回后 |
异常通知 | @AfterThrowing | 方法抛出异常时 |
环绕通知 | @Around | 包裹整个方法执行 |
@Aspect
注解@Aspect
@Component
public class TransactionAspect {
@Autowired
private PlatformTransactionManager txManager;
@Around("@annotation(org.springframework.transaction.annotation.Transactional)")
public Object manageTransaction(ProceedingJoinPoint pjp) throws Throwable {
TransactionStatus status = txManager.getTransaction(new DefaultTransactionDefinition());
try {
Object result = pjp.proceed();
txManager.commit(status);
return result;
} catch (Exception e) {
txManager.rollback(status);
throw e;
}
}
}
proxyTargetClass=true
强制CGLIB时需要评估内存开销Spring AOP通过优雅的代理机制实现了关注点分离,虽然存在一些局限性(如仅支持方法级别的拦截),但在大多数业务场景下都能提供高效的解决方案。 “`
(全文约650字)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。