Spring框架中 AOP(面向方面编程)是如何实现的?

发布时间:2024-04-19 13:42:59

spring aop 基于 java 动态代理实现面向方面的编程,允许在方法执行前后插入额外的逻辑而不修改原始代码。具体步骤如下:创建代理对象并使用它 proxy.newproxyinstance() 提供类加载器、接口和调用处理器的方法。调用处理器 invoke() 该方法获取目标对象和拦截器链,并依次调用拦截器 invoke()。最后,如果没有异常,调用目标对象的方法。

Spring框架中 AOP(面向方面编程)是如何实现的?

Spring AOP 的实现原理

AOP(面向编程)是一种编程示例,允许在执行方法前后插入附加逻辑而不修改原始代码。Spring 在框架中使用动态代理模式实现 AOP。

基于 Java 实现动态代理

Spring 主要使用 Java 动态代理创建代理对象,这是一个实现特定接口并可以调用拦截方法的类别。代理对象由代理对象组成 Proxy.newProxyInstance() 该方法需要提供以下参数:

  • 类加载器:获取代理类加载器
  • 接口:代理类实现的接口
  • 调用处理器:拦截方法调用的处理器

Spring AOP 调用处理器

Spring 实现了调用处理器 InvocationHandler 界面定义了当代理对象被调用时调用的方法 invoke() 方法。在 invoke() 方法中,Spring 执行以下步骤:

  1. 获取目标对象:原始对象包装在代理对象中。
  2. 拦截器链的获取方法:它是由切面(包括)制成的 AOP 逻辑模块)注册。
  3. 遍历拦截链,并依次调用每个拦截链 invoke() 方法。
  4. 若无异常,则调用目标对象的方法。

实战案例

考虑一个简单的 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(面向编程)是如何实现的?详情请关注图灵教育的其他相关文章!

上一篇 Hibernate ORM 框架的缺点是什么?
下一篇 返回列表

文章素材均来源于网络,如有侵权,请联系管理员删除。

标签: Java教程Java基础Java编程技巧面试题Java面试题