Maison  >  Article  >  Java  >  Comment l'AOP (programmation orientée aspect) est-elle implémentée dans le framework Spring ?

Comment l'AOP (programmation orientée aspect) est-elle implémentée dans le framework Spring ?

WBOY
WBOYoriginal
2024-04-18 08:27:011075parcourir

Spring AOP implémente une programmation orientée aspect basée sur des proxys dynamiques Java, permettant d'insérer une logique supplémentaire avant et après l'exécution de la méthode sans modifier le code d'origine. Les étapes spécifiques sont les suivantes : créez un objet proxy, utilisez la méthode Proxy.newProxyInstance() et fournissez un chargeur de classe, une interface et un gestionnaire d'appels. Appelez la méthode Invoquer () du processeur, obtenez l'objet cible, la chaîne d'intercepteurs et appelez les intercepteurs Invoquer () dans l'ordre. Enfin, si aucune exception ne se produit, la méthode de l'objet cible est appelée.

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

Comment Spring AOP est implémenté

AOP (programmation orientée aspect) est un paradigme de programmation qui permet d'insérer une logique supplémentaire avant et après l'exécution de la méthode sans modifier le code d'origine. AOP est implémenté dans le framework Spring à l'aide du modèle de proxy dynamique.

Implémentation basée sur le proxy dynamique Java

Spring utilise principalement le proxy dynamique Java pour créer des objets proxy, qui est une classe qui implémente une interface spécifique et peut intercepter les appels de méthode. L'objet proxy est créé par la méthode Proxy.newProxyInstance(), qui nécessite les paramètres suivants : Proxy.newProxyInstance() 方法创建,该方法需要提供以下参数:

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

Spring AOP 的调用处理器

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

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

实战案例

考虑一个简单的 Spring 应用,其中有一个 MyService 类。我们想要在 MyService.myMethod()

  • Chargeur de classe : récupère le chargeur de classe de la classe proxy
  • Interface : L'interface implémentée par la classe proxy
  • Processeur d'appel : Le processeur utilisé pour intercepter les appels de méthode

Le processeur d'appel de Spring AOP

Le processeur d'appel de Spring Implémente le Interface InvocationHandler, qui définit la méthode invoke() qui est appelée lorsque la méthode de l'objet proxy est appelée. Dans la méthode invoke(), Spring effectue les étapes suivantes :

  1. Obtention de l'objet cible : L'objet d'origine est enveloppé dans un objet proxy.
  2. Récupérer la chaîne d'intercepteur de méthode : elle est enregistrée par l'aspect (le module contenant la logique AOP).
  3. Parcourez la chaîne d'intercepteurs et appelez tour à tour la méthode invoke() de chaque intercepteur.
  4. S'il n'y a pas d'exception, la méthode de l'objet cible est appelée.
Cas pratique

Considérons une application Spring simple, qui possède une classe MyService. Nous souhaitons ajouter une logique de journalisation avant et après l'exécution de la méthode MyService.myMethod().

Configuration 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>

Configuration Java :

@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
    @Bean
    public MyService myService() {
        return new MyService();
    }

    @Bean
    public LoggingAspect loggingAspect() {
        return new LoggingAspect();
    }
}

🎜Classe 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()");
    }
}
🎜🎜Utilisation :🎜🎜
MyService myService = ApplicationContext.getBean(MyService.class);
myService.myMethod();
🎜Sortie : 🎜
Before myMethod()
After returning from myMethod()
🎜Cela montre comment utiliser Spring AOP sans modifier l'original code Ajoutez une logique supplémentaire à la méthode. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn