Maison Java javaDidacticiel 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 ?

Apr 18, 2024 am 08:27 AM
spring aop 动态代理 cadre de printemps

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 :

1

2

3

4

5

6

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

Copier après la connexion

Configuration Java :

1

2

3

4

5

6

7

8

9

10

11

12

13

@Configuration

@EnableAspectJAutoProxy

public class AppConfig {

    @Bean

    public MyService myService() {

        return new MyService();

    }

 

    @Bean

    public LoggingAspect loggingAspect() {

        return new LoggingAspect();

    }

}

Copier après la connexion

🎜Classe LoggingAspect : 🎜🎜

1

2

3

4

5

6

7

8

9

10

11

12

@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()");

    }

}

Copier après la connexion
🎜🎜Utilisation :🎜🎜

1

2

MyService myService = ApplicationContext.getBean(MyService.class);

myService.myMethod();

Copier après la connexion
🎜Sortie : 🎜

1

2

Before myMethod()

After returning from myMethod()

Copier après la connexion
🎜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 de ce site Web
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

Article chaud

Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Musée à deux points: toutes les expositions et où les trouver
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Article chaud

Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Musée à deux points: toutes les expositions et où les trouver
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Tags d'article chaud

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Quelles sont les méthodes de mise en œuvre des transactions programmatiques Spring ? Quelles sont les méthodes de mise en œuvre des transactions programmatiques Spring ? Jan 08, 2024 am 10:23 AM

Quelles sont les méthodes de mise en œuvre des transactions programmatiques Spring ?

Implémentation du mécanisme de réflexion des interfaces et des classes abstraites en Java Implémentation du mécanisme de réflexion des interfaces et des classes abstraites en Java May 02, 2024 pm 05:18 PM

Implémentation du mécanisme de réflexion des interfaces et des classes abstraites en Java

Un nouveau paradigme de programmation, quand Spring Boot rencontre OpenAI Un nouveau paradigme de programmation, quand Spring Boot rencontre OpenAI Feb 01, 2024 pm 09:18 PM

Un nouveau paradigme de programmation, quand Spring Boot rencontre OpenAI

Utilisez Spring Boot et Spring AI pour créer des applications d'intelligence artificielle générative Utilisez Spring Boot et Spring AI pour créer des applications d'intelligence artificielle générative Apr 28, 2024 am 11:46 AM

Utilisez Spring Boot et Spring AI pour créer des applications d'intelligence artificielle générative

Modifier RequestBody dans la passerelle Spring Modifier RequestBody dans la passerelle Spring Feb 09, 2024 pm 07:15 PM

Modifier RequestBody dans la passerelle Spring

Comment définir le niveau d'isolement des transactions au printemps Comment définir le niveau d'isolement des transactions au printemps Jan 26, 2024 pm 05:38 PM

Comment définir le niveau d'isolement des transactions au printemps

JAX-RS contre Spring MVC : une bataille entre les géants RESTful JAX-RS contre Spring MVC : une bataille entre les géants RESTful Feb 29, 2024 pm 05:16 PM

JAX-RS contre Spring MVC : une bataille entre les géants RESTful

Application du cadre de tests unitaires JUnit dans les projets Spring Application du cadre de tests unitaires JUnit dans les projets Spring Apr 18, 2024 pm 04:54 PM

Application du cadre de tests unitaires JUnit dans les projets Spring

See all articles