spring里面实现aop的方式有哪些
时间: 2024-04-07 13:17:56 浏览: 261
Spring实现AOP的方式有三种:
1. 基于代理的AOP:通过创建一个切面类来包装目标对象,形成代理类,然后在代理类中加入增强逻辑。
2. 基于AspectJ的AOP:AspectJ是一个独立的AOP框架,可以实现比Spring AOP更为强大的AOP功能。
3. 注解驱动的AOP:通过在代码中添加注解的方式来实现AOP,增强逻辑直接与注解绑定。
相关问题
spring中,aop的静态代理实现方式与例子
Spring中的AOP实现有两种方式:静态代理和动态代理。静态代理的实现方式是通过手动编写代理类来实现,而动态代理则是通过Java反射机制在运行时动态生成代理类。下面是静态代理的实现方式和例子。
首先,定义一个接口Subject,里面有一个方法request:
```java
public interface Subject {
void request();
}
```
然后,定义一个实现类RealSubject,实现Subject接口:
```java
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject Request");
}
}
```
接下来,定义一个代理类ProxySubject,也实现Subject接口,并在类中定义一个RealSubject类型的成员变量:
```java
public class ProxySubject implements Subject {
private RealSubject realSubject;
public ProxySubject(RealSubject realSubject) {
this.realSubject = realSubject;
}
@Override
public void request() {
System.out.println("ProxySubject before request");
realSubject.request();
System.out.println("ProxySubject after request");
}
}
```
在ProxySubject类中,我们在request方法调用RealSubject的request方法前后分别输出一些字符串,以此实现对RealSubject的代理。
最后,我们可以在客户端代码中创建RealSubject和ProxySubject对象,并调用request方法:
```java
public class Client {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
ProxySubject proxySubject = new ProxySubject(realSubject);
proxySubject.request();
}
}
```
输出结果为:
```
ProxySubject before request
RealSubject Request
ProxySubject after request
```
这就是静态代理的实现方式和例子。需要注意的是,静态代理只能代理一个类,如果要代理多个类,就需要编写多个代理类。而动态代理则可以在运行时动态生成代理类,从而避免了这个问题。
spring aop教程
### Spring AOP 教程与示例详解
#### 一、Spring AOP 基础概念
面向切面编程(AOP)是一种编程范式,旨在通过预编译方式和运行期间动态代理实现在不修改源代码的情况下给程序动态统一添加功能的技术[^3]。这种技术能够帮助开发者将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来。
#### 二、Spring AOP 实现机制
在Spring框架中,AOP的实现依赖于动态代理机制。当为某个Bean配置了切面之后,在实例化该Bean时会创建其代理对象而非原始对象本身。对于任何对该Bean的方法调用都会被导向至由代理类所定义的新版本方法上执行[^1]。具体来说:
- **JDK 动态代理**:适用于实现了接口的目标对象;
- **CGLIB 字节码增强**:用于未实现接口的情况;
这两种代理模式的选择取决于目标组件是否有对应的接口存在。
#### 三、编写第一个Spring AOP应用
为了更好地理解如何利用Spring AOP构建应用程序,这里给出一个简单案例——监控服务层方法性能的时间消耗情况。
##### 定义切入点表达式
首先需要指定哪些地方应该加入额外的功能处理,这被称为“切入点”。例如要捕获所有以`Service`结尾的服务类里面所有的公共成员函数,则可如下设置:
```java
@Pointcut("execution(public * *(..)) && (within(com.example.service.*Service))"
+"|| within(com.example.dao.*DAO)")
private void serviceAndDaoMethods() {}
```
上述代码片段表示匹配包名为`com.example.service`下所有以`Service`命名结尾的类里头公开访问权限的方法或者是位于`dao`目录下的数据访问对象内的任意操作[^2]。
##### 创建通知Advice
接着定义所谓的“建议”,即是在特定时机触发的动作。比如想要测量每次请求耗时时长的话就可以这样做:
```java
@Before("serviceAndDaoMethods()")
public void logMethodStart(JoinPoint joinPoint){
System.out.println("[START]-"+joinPoint.getSignature().getName());
}
@AfterReturning(pointcut="serviceAndDaoMethods()", returning="result")
public void logMethodEnd(JoinPoint joinPoint,Object result){
System.out.println("[END]-"+joinPoint.getSignature().getName()+" returned "+result);
}
```
以上两个注解分别代表前置条件(`Before`)和返回后(`AfterReturning`)的通知行为。每当有符合条件的方法被执行之前/结束后就会自动打印相应的消息到控制台上去。
##### 配置文件集成
最后一步就是在spring上下文中注册这些自定义好的aspect bean即可完成整个流程搭建工作啦!
```xml
<aop:config>
<!-- 启用aop支持 -->
</aop:config>
<bean id="performanceMonitor" class="com.example.PerformanceMonitor"/>
```
当然也可以采用基于Java Config的方式来进行声明式的装配过程。
---
阅读全文
相关推荐
















