Maison  >  Article  >  Java  >  "Essai d'entretien en huit parties" Printemps Volume 18

"Essai d'entretien en huit parties" Printemps Volume 18

Java后端技术全栈
Java后端技术全栈avant
2023-08-22 15:55:59994parcourir

"Spring Volume 18 de "Interview Eight-Part Essay" est de nouveau sorti. Cette fois, j'ai trié les questions d'entretien sur le printemps. J'ai également parcouru les questions d'entretien sur le printemps en ligne et les ai résumées. En gros, elles sont ici. Bien sûr, il peut y avoir des concepts trop basiques que j'ai directement organisés dans une certaine question, donc je n'ai pas ouvert de question distincte. Je souhaite à tout le monde un bon entretien ~



  • 1. utilisé au printemps ?

  • 2. Quels sont les modules de base au printemps ?

  • 3. Qu'entendez-vous par IOC

  • 4.

  • 5. Quelle est la différence entre BeanFactory et FactoryBean

  • 6. Alors, qu'est-ce que DI ?

  • 8. Qu'est-ce que l'AOP ?

  • 9. Quelle est la différence entre le proxy dynamique et le proxy statique

  • 10. Quelle est la différence entre le proxy dynamique JDK et le proxy CGLIB ?

  • 11.Quelle est la différence entre Spring AOP et AspectJ AOP ?

  • 12. Quel est le cycle de vie de Bean au printemps ?

  • 13. Comment Spring résout-il les dépendances circulaires

  • 14. le résoudre ?

  • 15.Quelle est la différence entre @Autowired et @Resource ?

  • 16.Quels sont les niveaux d'isolement des transactions de Spring ?

  • 17.Quels sont les mécanismes de propagation des transactions Spring ?

  • 18.springBoot principe d'assemblage automatique ?


  • 1. Quels modèles de conception sont utilisés au printemps ?

    • 「1. Modèle de conception d'usine」 : Par exemple, via BeanFactory et ApplicationContext pour produire des objets Bean
    • « 2 .Modèle de conception d'agent" : La mise en œuvre d'AOP se fait via un proxy. Spring utilise principalement le proxy dynamique JDK et le proxy CGLIB
    • "3. Modèle de conception Singleton" : Les beans de Spring sont uniques par défaut. Exemple
      .
    • 「4. Modèle de méthode de modèle」 : Au printemps, jdbcTemplate et les autres classes se terminant par Template qui fonctionnent sur la base de données utiliseront le modèle de conception de méthode de modèle, certaines fonctions courantes
    • 「5. Modèle" : Notre projet doit se connecter à plusieurs bases de données, et différents clients accéderont à différentes bases de données en fonction de leurs besoins lors de chaque visite.Ce mode nous permet de basculer dynamiquement entre différentes sources de données en fonction des besoins du client
    • 『6. Modèle d'observateur』 : Modèle d'observateur de modèle basé sur les événements Spring
    • 『7. une amélioration ou des conseils utilisent le modèle d'adaptateur

    2. Quels modules de base y a-t-il au printemps ?

    • 1.
      "Spring Core" : Spring Core, c'est la partie la plus basique du framework, fournissant des fonctionnalités d'IOC et d'injection de dépendances DI. : Il fournit un support pour le développement d'applications Web
    • 4.
      "Spring MVC" : Il cible la mise en œuvre d'idées MVC dans les applications Web
    • 5.
      "Spring DAO" : Fournit un support pour JDBC L'abstraction La couche simplifie le codage JDBC, et en même temps, le codage est plus robuste
    • 6.
      "Spring ORM" : Il prend en charge l'intégration de frameworks ORM populaires, tels que : Spring + Hibernate, Spring + iBatis, Spring + Intégration JDO, etc.
    • 7.
      "Spring AOP" : Programmation orientée aspect, qui fournit une implémentation de programmation compatible avec l'AOP Alliance
    • 3. Dites-moi ce que vous comprenez IOC ?
    • Tout d'abord, IOC est un
      "conteneur"
    • , qui est utilisé pour charger des objets. Son idée principale est
    "Inversion de contrôle"

    Alors quoi exactement "Qu'est-ce que l'inversion de contrôle" ? ?

    Inversion des moyens de contrôle, "Donner le contrôle de l'objet au ressort et le gérer par le conteneur ressort"
    , nous n'effectuons aucune opération

    Alors pourquoi "Quelle est la nécessité d'une inversion de contrôle" ?

    Imaginons que sans inversion de contrôle, nous devons "créer des objets et configurer les objets nous-mêmes", et aussi "gérer manuellement des objets et des objets Divers dépendances complexes entre elles", lorsqu'un projet passe à l'échelle, le maintien de cette relation est très gênant, il y a donc la notion d'inversion de contrôle, qui combine la création et la configuration d'objets, etc. Une série d'opérations sont gérés au printemps. Lorsque nous les utilisons, il nous suffit de les récupérer. 4. Que sont les conteneurs IOC au printemps ? Quelles sont les différences

    spring propose principalement "deux types de conteneurs IOC" ? "BeanFactory"

    , et l'autre est

    "ApplicationContext"La différence entre eux est que BeanFactory "fournit uniquement les fonctions les plus basiques d'instanciation d'objets et d'obtention d'objets", ApplicationContext est un produit dérivé de BeanFactory et est une sous-classe de celui-ci. Sa fonction est plus puissante, comme la prise en charge de l'injection d'annotations, de l'internationalisation et d'autres fonctions

    5 Quelle est la différence entre BeanFactory et FactoryBean ?

    Ces deux sont"produits différents".

    "BeanFactory est un conteneur IOC", qui est utilisé pour transporter des objets

    "FactoryBean est une interface", qui offre une manière plus flexible pour Bean En proxy un objet Bean, certaines opérations sont effectuées avant et après. la méthode.

    6. Quelles sont les différences entre @Repository, @Service, @Compent et @Controller

    L'essence de ces quatre annotations est la même. Elles mettent toutes l'objet identifié par l'annotation. conteneur à ressort, il s'agit simplement de distinguer les différentes couches d'application utilisées"
    • @Repository:dao layer
    • @Service:service layer
    • @Controller:controller layer
    • @Compent : Les autres couches qui n'appartiennent pas aux trois couches ci-dessus utilisent cette annotation de manière uniforme

    7. Alors, qu'est-ce que DI ?

    DI est une injection de dépendance. En fait, c'est à peu près la même chose qu'IOC, mais "Le même concept est expliqué sous différents angles"

    Ce que DI décrit. "Le point, ce sont les dépendances", nous avons dit"La fonction principale d'IOC est de fournir dynamiquement d'autres objets dépendants à un objet lorsque le programme est en cours d'exécution", et cette fonction est accomplie par DI. Par exemple, nous devons injecter. un objet A, et cet objet A dépend d'un objet B, alors nous devons injecter cet objet B dans l'objet A. Il existe trois méthodes d'injection dans Spring Injection de constructeur. injection

    • 8. Qu'est-ce que l'AOP ?
    • AOP signifie :
      "Programmation orientée aspect, qui permet une maintenance unifiée des fonctions du programme grâce à la pré-compilation et aux proxys dynamiques pendant l'exécution d'une technologie"
    • .
    • AOP est
      "la continuation de la POO (Programmation Orientée Objet)"
    • C'est un contenu important dans le framework Spring et un paradigme dérivé de la programmation fonctionnelle. AOP peut être utilisé pour isoler diverses parties de la logique métier, réduisant ainsi le couplage entre les différentes parties de la logique métier, améliorant la réutilisabilité des programmes et améliorant l'efficacité du développement.

    「La mise en œuvre d'AOP est principalement divisée en deux catégories :」
    • "Implémentation AOP statique" , framework AOP "pendant la phase de compilation" modifié le code source du programme et généré une classe proxy AOP statique (le fichier *.class généré a été modifié, vous devez utiliser un compilateur spécifique), comme AspectJ
    • "Dynamic AOP Implementation" , AOP framework "at runtime" pour les objets proxy générés dynamiquement (en mémoire avec proxy dynamique JDK, ou générés dynamiquement par la classe proxy CGlib AOP ), comme SpringAOP

    L'implémentation d'AOP au printemps est "implémentée via un proxy dynamique" Si l'interface est implémentée, le proxy dynamique JDK sera utilisé, sinon le proxy CGLIB sera utilisé.

    "Il existe 5 types de notification :"

    • "@Before" : Notifier avant que la méthode cible ne soit appelée
    • "@AfterReturning" : Retour ou exception lorsque la cible méthode renvoie Après l'appel
    • 「@AfterThrowing」 : Appelé après le retour de la méthode cible
    • 「@After」 : Appelé après que la méthode cible a une exception
    • 「@Around」 : Appelé après que la méthode cible a renvoyé une exception Encapsulez-le et déterminez vous-même l'heure d'appel

    9 Quelle est la différence entre un proxy dynamique et un proxy statique ?

    "Proxy statique"

    .
    • Le code source est créé par des programmeurs ou généré automatiquement par des outils spécifiques puis compilé. Avant que le programme ne soit exécuté, le fichier .class de la classe proxy existe déjà
    • Le proxy statique ne proxy généralement qu'une seule classe
    • Le proxy statique sait à l'avance quoi proxy

    "Procuration dynamique"

    • Créé dynamiquement à l'aide du mécanisme de réflexion lorsque le programme est en cours d'exécution
    • Un proxy dynamique est un proxy pour plusieurs classes d'implémentation sous une interface
    • Un proxy dynamique ne sait pas quoi proxy, il sait seulement quand il est en cours d'exécution

    10. Quelle est la différence entre le proxy dynamique JDK et le proxy CGLIB ?

    Classe métier proxy dynamique JDK "doit implémenter une certaine interface" , qui est "implémentée sur la base d'un mécanisme de réflexion" Elle génère une classe proxy qui implémente la même interface, puis réécrit la méthode. apporter des améliorations au code.

    Le proxy dynamique CGLIB utilise le framework de traitement de bytecode ASM. Son principe est d'utiliser la technologie du bytecode pour "créer une sous-classe pour une classe puis remplacer la méthode de la classe parent" pour améliorer le code.

    11.Quelle est la différence entre Spring AOP et AspectJ AOP ?

    Spring AOP est une amélioration du temps d'exécution, qui est obtenue grâce à

    "Implémentation du proxy dynamique"

    AspectJ AOP est une amélioration au moment de la compilation, qui nécessite un compilateur spécial pour être complétée et est obtenue grâce à

    "modification du code" , Support "trois méthodes de tissage"

    • "Tissage au moment de la compilation" : Il s'agit de tisser les classes proxy associées lors de la compilation du bytecode
    • "Tissage post-compilation" : Après la compilation de la classe initiale, il s'avère qu'une amélioration de l'AOP est nécessaire, puis tissage Entrez le code correspondant
    • "Tissage lorsque la classe est chargée" : fait référence au tissage lorsque le chargeur charge la classe
    Différence principale Spring AOP AspecjtJ AOP
    Méthode d'amélioration Amélioration du temps d'exécution Amélioration du temps de compilation
    Méthode d'implémentation Procuration dynamique Code de modification
    Compilateur javac Compilateur spécial ajc
    efficacité inférieure (performances de perte de réflexion à l'exécution) plus élevée
    méthode de tissage runtime Temps de compilation, après compilation, temps de chargement des classes

    12. Quel est le cycle de vie du Bean au printemps ?

    Le cycle de vie du SpringBean est grossièrement divisé en 4 étapes :

    • 1."Instanciation", instancier l'objet Bean
    • 2."Remplir les attributs", attribuer une valeur au Bean
    • 3."Initialisation"
      • Si l'interface Aware est implémentée, les ressources du conteneur seront obtenues via son interface
      • Si l'interface BeanPostProcessor est implémentée, les améliorations de pré- et post-traitement de l'interface seront rappelées
      • Si la méthode init-method est configurée, la méthode sera exécutée
    • 4. "Destroy"
      • Si l'interface DisposableBean est implémentée, la méthode destroy de l'interface sera rappelée
      • Si la méthode destroy-method est configurée, la méthode configurée par destroy-method sera exécutée

    13.spring Comment résoudre la dépendance circulaire ?

    La dépendance circulaire signifie que deux objets dépendent l'un de l'autre, formant un lien d'appel circulaire

    spring utilise le cache de troisième niveau pour résoudre la dépendance circulaire. Sa logique de base est de séparer les étapes d'instanciation et d'initialisation, puis de les mettre dans le cache pour les appeler par un autre objet

    • "Cache de premier niveau" : Utilisé pour enregistrer les objets instanciés et initialisés
    • "Cache de deuxième niveau" : Utilisé pour enregistrer les objets instanciés mais non initialisés
    • "Cache de troisième niveau" : utilisé pour enregistrer une fabrique d'objets et fournir une classe interne anonyme pour créer des objets dans le cache de deuxième niveau

    Lorsqu'une référence circulaire se produit entre les classes A et B Processus approximatif

    • 1 . Une fois que A a terminé l'instanciation, accédez à "Créer une fabrique d'objets et placez-la dans le cache de troisième niveau"
      • Si A est mandaté par AOP, alors ce qui est obtenu via cette usine est l'objet après A. proxy
      • Si A n'est pas proxy par AOP, alors ce que cette usine obtient est l'objet instancié par A
    • 2 Lorsque A effectue une injection d'attribut, allez dans "Créer B"
    • 3. .B nécessite A pour l'injection d'attribut, puis "Récupérez l'objet proxy d'usine A du cache de troisième niveau" et injectez-le, puis supprimez l'usine A dans le cache de troisième niveau et placez l'objet A dans le cache de deuxième niveau. cache
    • 4.B Terminez l'injection d'attributs suivante jusqu'à ce que l'initialisation soit terminée et placez B dans le cache de premier niveau
    • 5."A récupère B du cache de premier niveau et injecte B" , jusqu'à ce que les opérations suivantes soient terminées, supprimez A du cache de deuxième niveau et placez-le dans le cache de premier niveau, et la dépendance circulaire se termine

    spring Il y a deux conditions préalables pour résoudre les dépendances circulaires :

    • 1."Toutes les méthodes de constructeur ne sont pas"dépendance cyclique (sinon les opérations d'initialisation et d'instanciation ne peuvent pas être séparées)
    • 2."Doit être un singleton"(sinon il ne peut pas être garanti qu'il soit le même objet)

    14. Pourquoi utiliser le cache de troisième niveau ? Le cache de deuxième niveau ne peut-il pas le résoudre

    Oui, la fonction du cache de troisième niveau est de générer des objets proxy à l'avance ? uniquement lorsque des dépendances circulaires se produisent réellement, sinon il ne fera que "créer une usine et la mettre dans le cache de troisième niveau", mais il ne créera pas réellement d'objets via cette usine.

    Si vous utilisez le cache de deuxième niveau pour résoudre les dépendances circulaires, cela signifie que tous les beans doivent compléter le proxy AOP après l'instanciation, ce qui "viole les principes de conception de Spring" Spring est conçu à la dernière étape du Bean. cycle de vie pour terminer le proxy AOP au lieu d'effectuer le proxy AOP immédiatement après l'instanciation.

    15. Quelle est la différence entre @Autowired et @Resource ?

    • "@Resource est la propre annotation de Java", @Resource a deux attributs qui sont plus importants, à savoir le nom et le type ; Spring résout l'attribut name de l'annotation @Resource en nom du bean et l'attribut type en type de bean. Ainsi, si l'attribut name est utilisé, la stratégie d'injection automatique byName est utilisée, et lorsque l'attribut type est utilisé, la stratégie d'injection automatique byType est utilisée. Si ni l'attribut name ni l'attribut type ne sont spécifiés, la stratégie d'injection automatique byName sera utilisée via le mécanisme de réflexion.

    • "@Autowired est une annotation de spring", qui a été introduite dans la version spring2.5, n'injecte qu'en fonction du type, "ne correspondra pas au nom". Si le type ne peut pas identifier l'objet injecté, il doit être décoré avec des annotations @Qualifier ou @Primary.

      Quels sont les niveaux d'isolement des transactions du printemps ?

    1.

    「propagation_required」
    • La méthode actuelle
      "doit être exécutée dans un contexte avec une transaction"
    • S'il y a une transaction en cours sur le client, l'extrémité appelée le fera. exécuté dans la transaction, sinon une transaction sera rouverte.(Si une exception se produit du côté appelé, les transactions du côté appelant et du côté appelé seront annulées)
  • 2.「propagation_supports」
    • La méthode actuelle n'a pas besoin d'avoir un contexte de transaction, mais s'il y en a S'il s'agit d'une transaction, elle peut également être exécutée dans cette transaction
  • 3.「propagation_mandatory」
    • représente la méthode actuelle"doit être exécuté dans une transaction ", s'il n'y a pas de transaction, elle sera levée. Exception
  • 4.「propagation_nested」
    • Si la méthode actuelle a une transaction en cours d'exécution, la méthode devrait "s'exécuter dans une transaction imbriquée ", la transaction imbriquée peut être validée ou annulée indépendamment de la transaction encapsulée. Si la transaction encapsulée existe et que la transaction externe lève une exception à l'annulation, alors la transaction interne doit être annulée. Au contraire, la transaction interne n'affecte pas la transaction externe. Si la transaction encapsulée n'existe pas, c'est la même chose que propagation_required
  • 5.「propagation_never」
    • Le service actuel ne doit pas s'exécuter dans une transaction Si「Il y a une transaction, une. l'exception est levée "
  • 6."propagation_requires_new"
    • La méthode actuelle"doit s'exécuter dans sa propre transaction". Une nouvelle transaction sera démarrée et si une transaction existante est en cours d'exécution, cette méthode sera suspendue pendant l'exécution jusqu'à ce que la nouvelle transaction soit validée ou annulée.
  • 7.「propagation_not_supported」
    • la méthode ne doit pas être exécutée dans une transaction."Si une transaction est en cours, elle sera suspendue pendant la période en cours et l'exécution ne reprendra que lorsque la transaction sera validée ou annulée"

18.

  • 1. Lorsque le conteneur démarre, il appellera la méthode selectImports de EnableAutoConfigurationImportSelector.class
    "Obtenir une liste complète des BeanConfiguration couramment utilisés"

  • 2. -boot-autoconfigure.jar sous spring.factories,
    "Obtenez le nom de classe complet de tous les beans liés à Spring"

  • 3 Ensuite, continuez
    "Appelez le filtre pour filtrer un par un"

    et filtrez. certains dont nous n'avons pas besoin. Qualified Bean

  • 4 Enfin, injectez le BeanConfiguration qualifié dans la valeur de l'attribut dans la classe EnableConfigurationPropertie par défaut, et
    "injectez-le dans l'environnement IOC"

    .

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer