spring aop 基于 java 动态代理来实现面向方面编程,允许在不修改原始代码情况下,在方法执行前后插入附加逻辑。具体步骤如下:创建代理对象,使用 proxy.newproxyinstance() 方法,提供类加载器、接口和调用处理器。调用处理器的 invoke() 方法,获取目标对象、拦截器链,并依次调用拦截器 invoke()。最后,如果没有异常,调用目标对象的方法。
Spring AOP 的实现原理
AOP(面向方面编程)是一种编程范例,它允许在不修改原始代码的情况下,在方法执行前后插入附加逻辑。Spring 框架中使用动态代理模式实现了 AOP。
基于 Java 动态代理的实现
Spring 主要使用 Java 动态代理来创建代理对象,这是一个实现特定接口并可以拦截方法调用的类。代理对象由 Proxy.newProxyInstance()
方法创建,该方法需要提供以下参数:
- 类加载器:获取代理类的类加载器
- 接口:代理类实现的接口
- 调用处理器:用于拦截方法调用的处理器
Spring AOP 的调用处理器
Spring 的调用处理器实现了 InvocationHandler
接口,该接口定义了当代理对象的方法被调用时调用的 invoke()
方法。在 invoke()
方法中,Spring 执行以下步骤:
- 获取目标对象:原始对象被包装在代理对象中。
- 获取方法拦截器链:它是由切面(包含 AOP 逻辑的模块)注册的。
- 遍历拦截器链,并依次调用每个拦截器的
invoke()
方法。 - 如果没有异常,则调用目标对象的方法。
实战案例
考虑一个简单的 Spring 应用,其中有一个 MyService
类。我们想要在 MyService.myMethod()
方法执行前后添加日志记录逻辑。
XML 配置:
<bean id="myService" class="com.example.MyService" /> <bean id="loggingAspect" class="com.example.LoggingAspect"> <property name="pointcut"> <aop:pointcut expression="execution(* com.example.MyService.myMethod(..))" /> </property> </bean>
登录后复制
Java 配置:
@Configuration @EnableAspectJAutoProxy public class AppConfig { @Bean public MyService myService() { return new MyService(); } @Bean public LoggingAspect loggingAspect() { return new LoggingAspect(); } }
登录后复制
LoggingAspect 类:
@Aspect public class LoggingAspect { @Before("execution(* com.example.MyService.myMethod(..))") public void logBefore() { System.out.println("Before myMethod()"); } @AfterReturning("execution(* com.example.MyService.myMethod(..))") public void logAfterReturning() { System.out.println("After returning from myMethod()"); } }
登录后复制
使用:
MyService myService = ApplicationContext.getBean(MyService.class); myService.myMethod();
登录后复制
输出:
Before myMethod() After returning from myMethod()
登录后复制
这演示了如何使用 Spring AOP 在不修改原始代码的情况下向方法中添加附加逻辑。
以上就是Spring框架中 AOP(面向方面编程)是如何实现的?的详细内容,更多请关注叮当号网其它相关文章!
文章来自互联网,只做分享使用。发布者:老板不要肥肉,转转请注明出处:https://www.dingdanghao.com/article/367046.html