Spring框架中 AOP(面向方面编程)是如何实现的?
2024-04-19 13:42:59
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(面向编程)是如何实现的?详情请关注图灵教育的其他相关文章!