Sur l'auto-culture des programmeurs: concurrence, base de données, costume trois pièces de développement d'entrevue de printemps

Programmation simultanée, base de données et Spring, je pense qu'il s'agit d'un ensemble de trois entretiens de développement de programmeurs. Spring assure le développement. La base de données est utilisée pour maintenir et obtenir des données. La concurrence est d'améliorer les performances du programme. Elle est très importante et indissociable. Jetez un œil tous les jours, le développement n'est pas difficile.
Insérez la description de l'image ici

Une programmation simultanée

De plus, j'ai compilé une collection de questions d'entrevue depuis 20 ans, y compris spring, concurrence, base de données, Redis, distribué, dubbo, JVM, microservices, etc. La figure suivante est une capture d'écran partielle, si vous en avez besoin , cliquez ici , le mot de passe CSDN.

Insérez la description de l'image ici
1. Il existe plusieurs façons d'implémenter le multithreading en Java

(1) Hériter de la classe Thread;

(2) implémenter l'interface Runnable;

(3) Implémenter l'interface Callable pour créer un thread Thread via le wrapper FutureTask;

(4) Utilisez ExecutorService, Callable et Future pour implémenter le multithreading avec les résultats renvoyés (c'est-à-dire utiliser ExecutorService pour gérer les trois méthodes précédentes).

2. Comment arrêter un thread en cours d'exécution

(1) Utilisez l'indicateur de sortie pour que le thread se termine normalement, c'est-à-dire que le thread se termine lorsque la méthode d'exécution est terminée.

(2) Utilisez la méthode stop pour forcer l'arrêt, mais cette méthode n'est pas recommandée, car stop et suspendre et reprendre sont à la fois des méthodes expirées et non valides.

(3) Utilisez la méthode d'interruption pour interrompre le thread.

class MyThread extends Thread {
    
    
    volatile Boolean stop = false;
    public void run() {
    
    
        while (!stop) {
    
    
            System.out.println(getName() + " is running");
            try {
    
    
                sleep(1000);
            }
            catch (InterruptedException e) {
    
    
                System.out.println("week up from blcok...");
                stop = true;
                // 在异常处理代码中修改共享变量的状态
            }
        }
        System.out.println(getName() + " is exiting...");
    }
}
class InterruptThreadDemo3 {
    
    
    public static void main(String[] args) throws InterruptedException {
    
    
        MyThread m1 = new MyThread();
        System.out.println("Starting thread...");
        m1.start();
        Thread.sleep(3000);
        m1.interrupt();
        // 阻塞时退出阻塞状态
        Thread.sleep(3000);
        // 主线程休眠 3 秒以便观察线程 m1 的中断情况
        System.out.println("Stopping application...");
    }
}

3. Quelle est la différence entre notify () et notifyAll ()?

Notify peut provoquer un blocage, mais notifyAll ne le fera pas

À tout moment, un seul thread peut acquérir un verrou, c'est-à-dire qu'un seul thread peut exécuter le code de manière synchronisée. Utilisez notifyall pour réveiller tous les threads en état d'attente et ré-entrer dans la file d'attente de contention de verrous, tandis que notify ne peut en réveiller qu'un.

wait () doit être utilisé en conjonction avec la boucle while. Si elle ne doit pas être utilisée, la condition doit être vérifiée avant et après l'appel wait (). Si elle n'est pas remplie, vous devez appeler notify () pour réveiller un autre thread pour traitement, et continuer à attendre () jusqu'à ce que la condition soit remplie. Exécutez vers le bas.

Notify () est une optimisation de notifyAll (), mais elle a des scénarios d'application très précis et nécessite une utilisation correcte. Sinon, cela peut entraîner une impasse. Le scénario correct devrait être que l'attente dans WaitSet est la même condition, réveiller n'importe qui peut gérer correctement les choses suivantes, si le thread réveillé ne peut pas gérer correctement, assurez-vous de continuer à notifier () le thread suivant, et vous devez revenir à WaitSet.

4. Quelle est la différence entre sleep () et wait ()?

Pour la méthode sleep (), il faut d'abord savoir que la méthode appartient à la classe Thread. La méthode wait () appartient à la classe Object
.

La méthode sleep () oblige le programme à suspendre l'exécution pendant le temps spécifié, abandonnant l'autre thread du processeur, mais son état de surveillance est toujours maintenu, et il reprendra automatiquement l'état en cours d'exécution lorsque le temps spécifié est écoulé. Lors de l'appel de la méthode sleep (), le thread ne libère pas le verrou d'objet.

Lorsque la méthode wait () est appelée, le thread abandonne le verrou d'objet et entre dans le pool de verrous d'attente en attente de cet objet. Ce n'est qu'après l'appel de la méthode notify () pour cet objet que le thread entre dans la préparation du pool de verrous d'objet et acquiert le verrou d'objet et entre dans l'état d'exécution.

5. Qu'est-ce qui est volatile? La commande peut-elle être garantie?

Une fois qu'une variable partagée (variable de membre de classe, variable de membre statique de classe) est modifiée par volatile, alors elle a deux couches de sémantique:

(1) Assure la visibilité des différents threads opérant sur cette variable, c'est-à-dire qu'un thread modifie la valeur d'une variable, et la nouvelle valeur est immédiatement visible pour les autres threads. Le mot-clé volatile forcera la valeur modifiée Écrivez immédiatement dans la mémoire principale.

(2) Les instructions de réapprovisionnement sont interdites.

Volatile n'est pas une opération atomique

Qu'est-ce que pour assurer un ordre partiel?

Lorsque le programme exécute l'opération de lecture ou d'écriture de la variable volatile, toutes les modifications de l'opération précédente doivent avoir été effectuées et le résultat a été visible pour l'opération suivante; l'opération derrière elle ne doit pas avoir été effectuée;

x = 2;//语句 1
y = 0;//语句 2
flag = true;//语句 3
x = 4;//语句 4
y = -1;//语句 5

Puisque la variable indicateur est une variable volatile, pendant le processus de réorganisation des instructions, l'instruction 3 ne sera pas placée avant l'instruction 1 et l'instruction 2, et l'instruction 3 ne sera pas non plus placée après l'instruction 4 et l'instruction 5. Mais notez que l'ordre des instructions 1 et 2, ainsi que l'ordre des instructions 4 et 5 ne sont pas garantis.

L'utilisation de Volatile est généralement utilisée pour le verrouillage de double vérification du montant de la balise d'état et du mode singleton

6. Quelle est la différence entre les méthodes start () et run () dans la classe Thread?

La méthode start () est utilisée pour démarrer le thread nouvellement créé et la méthode run () est appelée en interne dans start (), ce qui n'est pas la même chose que d'appeler directement la méthode run (). Lorsque vous appelez la méthode run (), elle ne sera appelée que dans le thread d'origine. Si aucun nouveau thread n'est démarré, la méthode start () démarrera le nouveau thread.

7. Pourquoi wait, notify et notifyAll ne sont pas dans la classe thread?

La raison évidente est que les verrous fournis par JAVA sont au niveau de l'objet plutôt qu'au niveau du thread, et chaque objet a un verrou, qui est obtenu via un thread. Si le thread doit attendre certains verrous, il est logique d'appeler la méthode wait () dans l'objet. Si la méthode wait () est définie dans la classe Thread, il n'est pas évident de savoir quel verrou le thread attend. En termes simples, comme wait, notify et notifyAll sont des opérations au niveau du verrouillage, elles sont définies dans la classe Object car le verrou appartient à l'objet.

8. Pourquoi les méthodes d'attente et de notification devraient-elles être appelées dans un bloc synchronisé?

(1) Ce n'est que lorsque le thread appelant possède le verrou exclusif d'un objet que les méthodes wait (), notify () et notifyAll () de l'objet peuvent être appelées.

(2) Si vous ne le faites pas, votre code lèvera une IllegalMonitorStateException.

(3) Une autre raison est d'éviter les conditions de course entre l'attente et la notification.

La méthode wait () force le thread actuel à libérer le verrou d'objet. Cela signifie qu'avant d'appeler la méthode wait () d'un objet, le thread actuel doit avoir acquis le verrou de l'objet. Par conséquent, le thread doit être dans la méthode de synchronisation ou dans le bloc de code de synchronisation d'un objet pour appeler la méthode wait () de l'objet.

Avant d'appeler les méthodes notify () et notifyAll () de l'objet, le thread appelant doit avoir obtenu le verrou de l'objet. Par conséquent, la méthode notify () ou notifyAll () de l'objet doit être appelée dans la méthode de synchronisation ou le bloc de code de synchronisation d'un objet.

La raison de l'appel de la méthode wait () est généralement que le thread appelant veut continuer l'exécution après qu'un état spécial (ou une variable) est défini. La raison de l'appel de la méthode notify () ou notifyAll () est généralement que le thread appelant veut dire aux autres threads en attente: "L'état spécial a été défini." Cet état sert de canal de communication entre les threads et doit être un état partagé (ou une variable) mutable.

9. Quelle est la différence entre les méthodes interrompues et isInterruptedd en Java?

La principale différence entre interrompu () et isInterrupted () est que le premier effacera l'état interrompu tandis que le second ne le fera pas. Le mécanisme d'interruption du multi-threading Java est implémenté avec des indicateurs internes. L'appel de Thread.interrupt () pour interrompre un thread définira l'indicateur d'interruption sur true. Lorsque le thread interrompu appelle la méthode statique Thread.interrupted () pour vérifier l'état d'interruption, l'état d'interruption sera effacé. La méthode non statique isInterrupted () est utilisée pour interroger l'état d'interruption d'autres threads sans changer l'indicateur d'état d'interruption. En termes simples, toute méthode qui lance InterruptedException effacera l'état d'interruption. Dans tous les cas, l'état d'interruption d'un thread peut être modifié par d'autres threads appelant l'interruption.

10. Quelle est la différence entre synchronized et ReentrantLock en Java?
Similarité:

Il existe de nombreuses similitudes entre ces deux méthodes de synchronisation. Elles sont toutes deux une synchronisation verrouillée et une synchronisation bloquante. C'est-à-dire que si un thread obtient un verrou d'objet et entre dans le bloc de synchronisation, l'autre accès au bloc de synchronisation Les threads doivent être bloqués en attente en dehors du bloc synchronisé et le coût du blocage et du réveil des threads est relativement élevé.

la différence:

La plus grande différence entre ces deux méthodes est que pour Synchronized, il s'agit d'un mot-clé du langage Java, qui est une exclusion mutuelle au niveau de la syntaxe native, et nécessite une implémentation jvm. ReentrantLock est un verrou mutex au niveau API fourni après JDK 1.5, qui nécessite les méthodes lock () et unlock () avec des blocs d'instructions try / finally pour se terminer.

Une fois que Synchronized est compilé, deux instructions de bytecode, monitorrenter et monitorexit, sont formées avant et après le bloc de synchronisation. Lors de l'exécution de l'instruction monitorenter, essayez d'abord d'acquérir le verrouillage d'objet. Si l'objet n'est pas verrouillé ou si le thread actuel possède déjà le verrou de l'objet, le compteur de verrous est augmenté de 1, en conséquence, le compteur de verrous est diminué de 1 lorsque l'instruction de monitorexit est exécutée. Lorsque le compteur est à 0, le verrou A été libéré. Si l'acquisition du verrou d'objet échoue, le thread actuel se bloquera jusqu'à ce que le verrou d'objet soit libéré par un autre thread.

Étant donné que ReentrantLock est un ensemble de verrous d'exclusion mutuelle fournis sous le package java.util.concurrent, par rapport à Synchronized, la classe ReentrantLock fournit des fonctions avancées, principalement les 3 éléments suivants:

(1) L'attente peut être interrompue. Lorsque le thread qui maintient le verrou n'est pas libéré pendant une longue période, le thread en attente peut choisir d'abandonner l'attente, ce qui équivaut à Synchronized, ce qui peut éviter un blocage.

(2) Verrous équitables, lorsque plusieurs threads attendent le même verrou, ils doivent acquérir les verrous dans l'ordre où ils s'appliquent pour les verrous. Les verrous synchronisés ne sont pas des verrous équitables. Le constructeur par défaut de ReentrantLock est un verrou injuste créé, qui peut être défini sur fair via le paramètre true Verrouiller, mais les performances de verrouillage correctes ne sont pas très bonnes.

(3) Le verrou lie plusieurs conditions et un objet ReentrantLock peut se lier à deux objets en même temps.

Deux, MySQL

Insérez la description de l'image ici

1. Quels types de serrures existe-t-il dans Mysql?

(1) Verrou au niveau de la table: faible hauteur et verrouillage rapide. Il n'y a pas de blocage, la granularité des verrous est grande, la probabilité de conflits de verrous est élevée et la concurrence est faible.

(2) Verrous au niveau des lignes: coûteux et lents à verrouiller. Il y aura des blocages, la granularité des verrous est faible, la probabilité de conflits de verrous est faible et la concurrence est élevée.

(3) Verrous de page: temps de surcharge, temps de verrouillage et granularité de verrouillage entre les verrous de niveau table et les verrous de niveau ligne, des blocages se produiront, avec une concurrence modérée.

2. La différence entre CHAR et VARCHAR?

(1) La longueur de CHAR est immuable, allant de 1 à 255. Si la longueur de stockage n'atteint pas la longueur définie, elle sera remplie d'espaces. La vitesse d'accès est rapide, mais il est facile de perdre de l'espace.

(2) La longueur de VARCHAR est variable, allant de 1 à 65535. Si la longueur de stockage n'atteint pas la longueur définie, les données de longueur réelle sont stockées. La vitesse d'accès est légèrement plus lente, mais cela économise de l'espace.

3. Pouvez-vous me dire la différence entre myisam et innodb?

Le moteur myisam est le moteur par défaut avant la version 5.1. Il prend en charge la récupération de texte intégral, la compression, les fonctions spatiales, etc., mais ne prend pas en charge les transactions et les verrous au niveau des lignes. Il est donc généralement utilisé dans les scénarios où il y a un grand nombre de requêtes et une petite quantité d'insertion, et myisam ne prend pas en charge les clés étrangères. Et l'index et les données sont stockés séparément.

Innodb est basé sur un index clusterisé. Contrairement à myisam, il prend en charge les transactions, les clés étrangères et prend en charge une forte concurrence via MVCC. Les index et les données sont stockés ensemble.

4. Pouvez-vous parler des caractéristiques de base et des niveaux d'isolement des transactions?
Transaction: Dans la base de données, une série d'opérations sur des données peut être considérée comme un tout, appelée transaction. Ce tout est soit entièrement exécuté, soit pas du tout exécuté.
L'existence d'attributs ACID garantit la fiabilité des transactions.
(1) Actomicité (atomicité): L'atomicité nécessite que toutes les opérations de la transaction soient soit terminées, soit restaurées à un état auparavant inopéré. Autrement dit, après l'échec d'une certaine opération de la transaction, cela équivaudra à ce que rien ne se soit produit et il n'y aura aucun changement dans une partie des données.

(2) Cohérence (cohérence): La cohérence nécessite que l'état de la base de données soit cohérent avant et après l'exécution de la transaction, c'est-à-dire passer d'un état cohérent à un autre état cohérent.

(3) Isolation: L'isolement nécessite que les transactions simultanées soient isolées et invisibles. Autrement dit, une transaction ne peut pas voir l'opération et les données d'une autre transaction.

(4) Durabilité (persistance): La durabilité exige que la modification des données de la base de données par la transaction soit permanente. Autrement dit, une fois que les données sont modifiées et soumises, leur état restera définitivement inchangé.

5. Problèmes de concurrence - lectures sales, lectures non répétables, lectures fantômes?

Pour plusieurs transactions s'exécutant en même temps, si ces transactions accèdent aux mêmes données, le mécanisme d'isolation nécessaire n'est pas adopté, ce qui entraînera les problèmes de concurrence suivants.
(1) Lecture incorrecte: la lecture incorrecte fait référence au moment où une transaction accède à certaines données, et les données sont modifiées, et ces données n'ont pas été soumises à la base de données, si une autre transaction accède également à ces données , Ce qui est obtenu, ce sont ces données modifiées, les données obtenues à ce moment sont incorrectes, c'est-à-dire une lecture sale.
Par exemple: l'âge de tom est de 22 ans et la transaction A modifie l'âge de tom à 30 ans. À ce stade, elle n'a pas été soumise à la base de données. À ce stade, la transaction B obtient l'âge de tom et en obtient 30. La transaction A annule les données. Les données de la base de données sont toujours de 22 ans, mais Les données obtenues par la transaction B sont 30, ce qui est une lecture incorrecte, et les données sont lues incorrectement.

(2) Lecture non répétable: fait référence à une transaction qui lit les mêmes données plusieurs fois. Avant la fin de cette transaction, une autre transaction accède également aux données et les modifie, ce qui peut entraîner des données incohérentes lues par la transaction plusieurs fois. , Ce qui n'est pas reproductible.
Par exemple: l'âge de Tom est de 22 ans, la transaction A lit l'âge de Tom comme 22 ans et la transaction n'est pas terminée. À ce moment, la transaction B modifie l'âge de tom à 30 ans et le soumet à la base de données. Lorsque la transaction A lit à nouveau l'âge de tom à 30 ans, les données lues deux fois par la transaction A sont incohérentes, c'est-à-dire qu'elles ne peuvent pas être lues de manière répétée.

(3) Lecture fantôme: fait référence au phénomène lorsque la transaction n'est pas exécutée indépendamment. Une transaction modifie une table, impliquant toutes les lignes de la table, tandis qu'une autre transaction modifie également la table, comme l'ajout ou la suppression d'un élément de données. À ce moment, la première transaction a révélé qu'il y avait une donnée supplémentaire ou manquante. Cette situation est une lecture fantôme.
Par exemple: La transaction A interroge la table actuelle avec un total de 11 données, à ce moment, la transaction B insère un élément de données dans la table et la transaction A interroge à nouveau la table actuelle avec un total de 12 données, ce qui est une lecture fantôme.

Remarque: la
    compréhension de la lecture non répétable et de la lecture fantôme est quelque peu similaire.
    La lecture non répétable est une opération sur une donnée, et la clé est de modifier une donnée.
    La lecture fantôme consiste à opérer sur la table, la clé est d'ajouter ou de supprimer une certaine donnée.

6. Quel est le niveau d'isolement de la transaction?

Le système de base de données doit pouvoir isoler les transactions exécutées simultanément afin que chaque transaction ne s’affecte pas et évite les problèmes de concurrence.
  Niveau d'isolement: fait référence au degré d'isolement entre une transaction et d'autres transactions. Plus le niveau d'isolement est élevé, plus la concurrence est faible.
(1) Lecture non validée: lecture du contenu non validé.
  Généralement non utilisé. Sous ce niveau d'isolement, la requête ne sera pas verrouillée, c'est-à-dire qu'il peut y avoir deux transactions opérant sur la même table. Peut provoquer une «lecture sale», une «lecture non répétable», une «lecture fantôme».

(2) Read Committed: Seul le contenu soumis peut être lu.
  Couramment utilisé (oracle, niveau d'isolement par défaut de SQL Server). Sous ce niveau d'isolement, la requête adopte un mécanisme de lecture d'instantané, c'est-à-dire que les données non validées ne seront pas lues, évitant ainsi les «lectures sales», mais cela peut toujours conduire à des «lectures non répétables» et des «lectures fantômes».

(3) Lecture répétable (lecture répétable)
  couramment utilisée (niveau d'isolement par défaut de mysql). Sous ce niveau d'isolement, la requête utilise un mécanisme de lecture d'instantané, et après le démarrage de la transaction, les données actuelles ne peuvent pas être modifiées, ce qui peut éviter une «lecture non répétable», mais cela peut toujours provoquer une «lecture fantôme» (ajout ou suppression d'un certain élément de données).

(4) Serializable (sérialisation) n'est
  généralement pas utilisé. Sous ce niveau d'isolement, les transactions seront exécutées en série (exécution en file d'attente), ce qui se traduira par une efficacité d'exécution médiocre et une surcharge élevée. Peut éviter "lecture sale", "lecture non répétable", "lecture fantôme".

【举例:】
select @@transaction_isolation; -- 用于查看当前数据库的隔离级别(8.0版本)
 set session transaction isolation level read committed; --用于设置隔离级别为 read committed


7. Parlez-vous de la clé primaire à incrémentation automatique et de l'UUID?

(1) Clé primaire auto-incrémentée, les données sont stockées séquentiellement dans une structure physique, avec de bonnes performances et une petite occupation de l'espace. Peut être de type int et bigint. int 4 octets, bigint 8 octets, la théorie ne devrait pas apparaître dans le projet selon laquelle la clé primaire auto-incrémentée atteint la valeur maximale, car les données sont trop volumineuses, l'efficacité sera considérablement réduite, lorsqu'une certaine quantité de données apparaît, l'opération de base de données et de table doit être effectuée .

(2) UUID, les données sont stockées au hasard dans la structure physique, avec de mauvaises performances et une grande occupation de l'espace. ID unique, jamais de conflit.

Trois, printemps

Insérez la description de l'image ici

1. Qu'est-ce que le conteneur Spring IOC?

Le cœur du framework Spring est le conteneur Spring. Le conteneur crée des objets, les assemble, les configure et gère leur cycle de vie complet. Le conteneur Spring utilise l'injection de dépendances pour gérer les composants qui composent l'application. Le conteneur reçoit des instructions d'instanciation, de configuration et d'assemblage d'objets en lisant les métadonnées de configuration fournies. Les métadonnées peuvent être fournies via XML, annotations Java ou code Java.
Insérez la description de l'image ici
2. Qu'est-ce que l'injection de dépendances?

Dans l'injection de dépendances, vous n'avez pas besoin de créer des objets, mais vous devez décrire comment les créer. Vous ne connectez pas directement des composants et des services dans le code, mais décrivez quels composants du fichier de configuration nécessitent quels services. Ils sont assemblés par le conteneur IoC.

3. De combien de façons l'injection de dépendances peut-elle être réalisée?

Généralement, l'injection de dépendances peut être effectuée de trois manières, à savoir:

Injection de constructeur Injection de
setter Injection d'
interface
Dans Spring Framework, seules les injections de constructeur et de setter sont utilisées.

4. Distinguer l'injection du constructeur et l'injection du poseur.
Insérez la description de l'image ici
5. Combien de types de conteneurs IOC y a-t-il au printemps?

BeanFactory-BeanFactory est comme une classe d'usine qui contient une collection de beans. Il instanciera le bean à la demande du client.

ApplicationContext - L'interface ApplicationContext étend l'interface BeanFactory. Il fournit des fonctions supplémentaires sur la base de BeanFactory.

6. Distinguer BeanFactory et ApplicationContext.
Insérez la description de l'image ici

8. Qu'est-ce qu'un haricot de printemps?

Ce sont les objets qui forment l'épine dorsale de l'application de l'utilisateur.
Les beans sont gérés par le conteneur Spring IoC.
Ils sont instanciés, configurés, assemblés et gérés par le conteneur Spring IoC.
Le bean est créé en fonction des métadonnées de configuration fournies par l'utilisateur au conteneur.
9. Quelles méthodes de configuration Spring propose-t-il?

Basé sur la configuration xml

Les dépendances et services requis par le bean sont spécifiés dans le fichier de configuration au format XML. Ces fichiers de configuration contiennent généralement de nombreuses définitions de bean et des options de configuration spécifiques à l'application. Ils commencent généralement par l'étiquette de haricot. Par exemple:

<bean id="studentbean" class="org.edureka.firstSpring.StudentBean">
        <property name="name" value="Edureka"></property>
    </bean>

Configuration basée sur des annotations

Au lieu d'utiliser XML pour décrire l'assembly du bean, vous pouvez configurer le bean en tant que classe de composant elle-même en utilisant des annotations sur les déclarations de classe, de méthode ou de champ associées. Par défaut, l'assemblage d'annotations n'est pas activé dans le conteneur Spring. Par conséquent, vous devez l'activer dans le fichier de configuration Spring avant de l'utiliser. Par exemple:

<beans>
        <context:annotation-config/>
        <!-- bean definitions go here -->
    </beans>

Configuration basée sur l'API Java

La configuration Java de Spring est réalisée en utilisant @Bean et @Configuration.

2.1 L'annotation @Bean joue le même rôle que l'élément.

2.2 La classe @Configuration permet de définir des dépendances inter-bean en appelant simplement d'autres méthodes @Bean dans la même classe.

Par exemple:

public class StudentConfig {
    
    
    @Bean
    public StudentBean myStudent() {
    
    
        return new StudentBean();
    }
}

10. Qu'est-ce que l'AOP?

AOP (Aspect-Oriented Programming), c'est-à-dire la programmation orientée aspect, il complète la programmation orientée objet (Object-Oriented Programming, programmation orientée objet) et offre une perspective de structure logicielle abstraite différente de la POO. En POO, nous utilisons des classes Comme notre unité de base, l'unité de base dans AOP est Aspect (section)

11. Quels sont les paramètres Aspect, Advice, Pointcut, JointPoint et Advice dans AOP?
Insérez la description de l'image ici

  • Aspect-Aspect est une classe qui met en œuvre des questions transversales, telles que la gestion des transactions. L'aspect peut être une classe commune configurée puis configurée dans le fichier de configuration Spring Bean, ou nous pouvons utiliser Spring AspectJ pour prendre en charge l'annotation @Aspect afin de déclarer la classe en tant qu'aspect.
  • Advice-Advice est l'action entreprise pour un JoinPoint spécifique. En termes de programmation, ce sont des méthodes qui sont exécutées lorsqu'un JoinPoint spécifique avec un pointcut correspondant est atteint dans l'application. Vous pouvez considérer Advice comme un Spring Interceptor ou un filtre Servlet.
  • Arguments de conseil - Nous pouvons passer des paramètres dans la méthode de conseil. Nous pouvons utiliser l'expression args () dans le pointcut pour appliquer à toute méthode qui correspond au modèle de paramètre. Si nous l'utilisons, nous devons utiliser le même nom dans la méthode de conseil qui détermine le type de paramètre.
  • Pointcut-Pointcut est une expression régulière qui correspond à JoinPoint et est utilisée pour déterminer si le conseil doit être exécuté. Pointcut utilise différents types d'expressions qui correspondent à JoinPoint. Le framework Spring utilise le langage d'expression AspectJ Pointcut pour déterminer le JoinPoint qui appliquera la méthode de notification.
  • JoinPoint-JoinPoint est un point spécifique de l'application, tel que l'exécution de la méthode, la gestion des exceptions, la modification des valeurs de variable d'objet, etc. Dans Spring AOP, JoinPoint est toujours l'exécuteur de la méthode.

12. Quels sont les moyens de mettre en œuvre l'AOP?

Les technologies de mise en œuvre de l'AOP sont principalement divisées en deux catégories:

Proxy statique - fait référence à l'utilisation des commandes fournies par le framework AOP pour compiler, de sorte que les classes proxy AOP puissent être générées au stade de la compilation, donc il est également appelé amélioration au moment de la compilation; tissage au moment de la compilation (implémentation spéciale du compilateur) tissage de chargement de classe (chargement de classe spécial) Mettre en place).
La classe de proxy dynamique proxy-AOP dynamique est "temporairement" générée en mémoire lors de l'exécution, elle est donc également appelée amélioration d'exécution. Proxy dynamique JDK CGLIB
13. Quelle est la différence entre Spring AOP et AspectJ AOP?

Spring AOP est implémenté sur la base du mode proxy dynamique; AspectJ est implémenté sur la base du mode proxy statique. Spring AOP ne prend en charge PointCut qu'au niveau de la méthode; il fournit un support AOP complet et il prend également en charge PointCut au niveau de l'attribut.

5. Enfin:

Compte tenu du fait que de nombreuses personnes ont interviewé récemment, j'ai également compilé de nombreux sujets d'entrevue ici, ainsi que l'expérience d'autres grandes entreprises. J'espère que cela aide tout le monde.

Les réponses aux questions d'entrevue ci-dessous sont organisées en notes documentaires. J'ai également trié certains matériaux d'entrevue et les dernières questions d'entrevue collectées par certaines grandes entreprises en 2020 (toutes organisées en documents, une petite partie des captures d'écran), si nécessaire, vous pouvez cliquer pour entrer le CSDN secret

Insérez la description de l'image ici

Insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/banzhuanhu/article/details/109278699
conseillé
Classement