Maison  >  Article  >  Java  >  Résumé des dernières questions d'entretien sur le cadre SSH en 2023

Résumé des dernières questions d'entretien sur le cadre SSH en 2023

王林
王林avant
2020-10-19 17:02:593414parcourir

Résumé des dernières questions d'entretien sur le cadre SSH en 2023

Comment fonctionne Hibernate et pourquoi devrions-nous utiliser Hibernate ?

(Recommandations pour des questions d'entretien plus connexes : questions et réponses d'entretien Java)

Principe de fonctionnement :

1. Lire et analyser la configuration fichier

2. Lire et analyser les informations de mappage, créer SessionFactory

3. Ouvrir une session

4. Créer une transaction Transation

5. Opération de persistance

6. Soumettre la transaction

7. Fermer la session

8. Fermer la SessionFactory

Pourquoi utiliser Hibernate (c'est-à-dire ses avantages) :

1. Le code d'accès JDBC à la base de données est encapsulé, ce qui simplifie grandement le code fastidieux et répétitif de la couche d'accès aux données.

2. Hibernate est un framework de persistance grand public basé sur JDBC et une excellente implémentation ORM. Cela simplifie grandement le travail de codage de la couche DAO

3. hibernate utilise le mécanisme de réflexion Java au lieu du programme d'amélioration du bytecode pour assurer la transparence.

4. La flexibilité du mappage d'hibernation est excellente. Il prend en charge diverses bases de données relationnelles et diverses relations complexes allant de un à un à plusieurs à plusieurs.

2. La différence entre les méthodes get et load dans Hibernate

Pour la méthode de chargement, hibernate pense que les données doivent exister dans la base de données. Vous pouvez utiliser le proxy en toute sécurité pour retarder le chargement. vous le trouvez pendant l'utilisation, Si le problème est résolu, vous ne pouvez lancer qu'une exception ;

hibernate Pour la méthode get, hibernate doit obtenir les données réelles, sinon il retournera null.

Introduction détaillée :

1. Pour la méthode get, hibernate confirmera si les données correspondant à l'identifiant existent, recherchera d'abord dans le cache de session, puis recherchera dans le cache de deuxième niveau Pas encore Interrogez simplement la base de données et renvoyez null si elle n'est pas trouvée dans la base de données.

2. Lorsque la méthode de chargement charge l'objet entité, il est configuré en fonction de l'attribut paresseux au niveau de la classe sur le fichier de mappage (la valeur par défaut est true).

Discutez au cas par cas :

(1) Si c'est vrai, recherchez d'abord dans le cache de Session pour voir si l'objet correspondant à l'id existe. utilisez le chargement différé pour renvoyer l'entité. L'objet de classe proxy (la classe proxy est une sous-classe de la classe d'entité et est générée dynamiquement par CGLIB). Lorsque l'objet est réellement utilisé (sauf pour obtenir l'OID), le cache et la base de données de deuxième niveau sont ensuite interrogés. Si aucun enregistrement correspondant n'est trouvé, une exception ObjectNotFoundException sera levée.

(2) S'il est faux, l'ordre de recherche est le même que la méthode get, sauf que si aucun enregistrement répondant aux conditions n'est trouvé, une ObjectNotFoundException sera levée.

3. Comment Hibernate retarde-t-il le chargement ?

Hibernate3 fournit la fonction de chargement paresseux des propriétés. Lorsque Hibernate interroge les données, les données n'existent pas dans la mémoire. Au lieu de cela, l'objet existe dans la mémoire lorsque le programme opère réellement sur les données. Cela implémente un chargement paresseux, ce qui économise la surcharge de mémoire du serveur, améliorant ainsi les performances du serveur. .

4. Comment réaliser la relation entre les classes dans Hibernate ?

La relation entre les classes se reflète principalement dans la relation entre les tables et les tables. Pour faire fonctionner les objets, nous cartographions. toutes les tables et classes ensemble dans le programme, et elles fonctionnent via plusieurs à un, un à plusieurs et plusieurs à plusieurs dans le fichier de configuration.

5. Quelle est la différence entre update() et saveOrUpdate() dans Hibernate ?

saveOrUpdate() :

1. Si l'objet est déjà persistant dans cette session, ne faites rien

2. S'il y a un autre objet associé à cette session Ayez le même identifiant persistant (identifiant), lancez une exception

3. Si l'objet n'a pas d'attribut d'identifiant persistant (identifiant), appelez save() dessus

4. Si l'objet L'identifiant persistant (identifiant) ​​indique qu'il s'agit d'un objet nouvellement instancié. Appelez save()

5. Si l'objet est livré avec des informations de version (via ou ) et le version La valeur de la propriété indique qu'il s'agit d'un objet nouvellement instancié et appelle save(). Sinon, update() cet objet.

update() :

met directement à jour un objet entité gratuit.

6. Parlons du mécanisme de mise en cache d’Hibernate.

1. Cache de premier niveau : le cache interne existe dans Hibernate et est un cache au niveau des transactions d'application.

2. Cache de deuxième niveau : cache au niveau de l'application, cache distribué.

Scénarios d'utilisation : les données ne seront pas modifiées par des tiers, la taille des données est dans une plage acceptable, la fréquence de mise à jour des données est faible, les mêmes données sont fréquemment utilisées par le système, données non critiques

3. Introduisez un cache tiers (tel que ehcache, etc.).

7. Comment optimiser la mise en veille prolongée ?

1. Utilisez une association bidirectionnelle un-à-plusieurs au lieu d'une association unidirectionnelle un-à-plusieurs

2. Utilisez de manière flexible une association unidirectionnelle un-à-plusieurs

.

3. Pas besoin de un-à-un, remplacez

par plusieurs-à-un 4. Configurez le cache d'objets, n'utilisez pas le cache de collection

5. -to-many collections et Set pour plusieurs-to-many

6 . Utilisez le polymorphisme explicite pour les classes héritées

7 Ayez moins de champs de table, n'ayez pas peur d'en avoir trop. associations de tables et prendre en charge le cache de deuxième niveau

8 Parlons du chargement paresseux d'hibernate et d'openSessionInView

Le chargement doit être chargé dans la plage de session

OPENSESSIONView ; écrit un fichier dans la couche Web pour ouvrir et fermer la session. L'activation garantit le principe d'un chargement paresseux dans la session.

(Recommandation vidéo :

cours Java )

9, décrivez brièvement le flux de travail de struts2


1 Le navigateur client envoie une demande HTTP. .

2. Selon la configuration web.xml, la requête est reçue par FilterDispatcher.

3. Selon la configuration struts.xml, recherchez la classe Action et la méthode qui doivent être appelées, et injectez la valeur dans Aciton via IoC.

4. L'action appelle le composant de logique métier pour traiter la logique métier.

5. Une fois l'action exécutée, recherchez le résultat de retour correspondant selon la configuration dans struts.xml et accédez à la page correspondante.

6. Renvoie la réponse HTTP au navigateur client.

10. Parlons du modèle de conception de Struts

Modèle MVC


1. ActionServlet sera chargé et initialisé au démarrage de l'application Web

;

2. Lorsque l'utilisateur soumet le formulaire, un objet ActionForm configuré est créé et rempli avec les données correspondantes du formulaire

3. ActionServlet détermine si un formulaire est requis en fonction des paramètres configurés dans le fichier Struts-config.xml Vérifiez, si nécessaire, appelez Validate() d'ActionForm pour vérifier et sélectionner à quelle action envoyer la demande. Si l'action n'existe pas, ActionServlet créera d'abord l'objet, puis appellera l'exécution() de l'action.

4. Execute() obtient les données de l'objet ActionForm, complète la logique métier et renvoie un objet ActionForward puis transmet la demande du client au composant jsp spécifié par l'objet ActionForward ;

5. Le jsp spécifié par l'objet ActionForward génère une page Web dynamique, renvoyée au client.

11, Avantages et inconvénients de Struts

Avantages :


1. Implémenter le modèle MVC avec une structure claire, permettant aux développeurs de se concentrer uniquement sur la mise en œuvre de logique métier.

2. Il existe une bibliothèque de balises riches Struts (Taglib), si elle est utilisée de manière flexible, peut considérablement améliorer l'efficacité du développement. De plus, en ce qui concerne les développeurs JSP nationaux, en plus d'utiliser les balises communes fournies avec JSP, ils développent rarement leurs propres balises. Peut-être que Struts est un bon point de départ.

3. Navigation dans les pages. La navigation dans les pages sera une direction de développement à l'avenir. En fait, cela rendra le contexte du système plus clair. Grâce à un fichier de configuration, vous pouvez saisir la connexion entre les différentes parties de l'ensemble du système, ce qui est très utile pour une maintenance ultérieure. Cet avantage devient encore plus évident lorsqu'un autre groupe de développeurs reprend le projet.

4. Fournir un mécanisme de gestion des exceptions.

5. Gestion du pool de connexions à la base de données

6. Prise en charge I18N

Inconvénients :

1 Lorsque vous accédez à la couche d'affichage, vous devez configurer le transfert. Chaque fois que vous accédez à la couche d'affichage, je pense que la plupart d'entre eux vont directement vers jsp. En ce qui concerne la redirection, vous devez configurer le transfert. dans la couche d'affichage, vous devez le configurer dix fois, et cela n'inclut parfois pas les modifications de répertoires et de fichiers, qui nécessitent une re-modification du transfert. Notez qu'à chaque fois que la configuration est modifiée, l'ensemble du projet doit être modifié. redéployé et un serveur comme Tomcate doit être redémarré Si les changements commerciaux sont complexes et fréquents, une telle opération est d'une simplicité inimaginable. Ça y est, des dizaines ou des centaines de personnes utilisent notre système en ligne en même temps. Vous pouvez imaginer à quel point je suis troublé.

2. L'action Struts doit être thread-safe, ce qui permet à une seule instance de gérer toutes les requêtes. Par conséquent, toutes les ressources utilisées par les actions doivent être uniformément synchronisées, ce qui entraîne des problèmes de sécurité des threads.

3. Les tests ne sont pas pratiques. Chaque action de Struts est couplée à la couche Web, donc ses tests dépendent du conteneur Web et les tests unitaires sont également difficiles à mettre en œuvre. Cependant, il existe un outil d'extension Junit, Struts TestCase, qui peut implémenter ses tests unitaires.

4. Conversion de type. FormBean de Struts traite toutes les données comme du type String et peut utiliser l'outil Commons-Beanutils pour la conversion de type. Mais sa conversion se fait entièrement au niveau de la classe et le type de conversion n'est pas configurable. Il est également très difficile de renvoyer à l'utilisateur des messages d'erreur lors de la conversion de type.

5. Trop de dépendance à l'égard de Servlet. Struts doit s'appuyer sur ServletRequest et ServletResponse lors du traitement de l'action, il ne peut donc pas se débarrasser du conteneur Servlet.

6. En termes de langage d'expression front-end, Struts intègre JSTL, il utilise donc principalement le langage d'expression JSTL pour obtenir des données. Cependant, le langage d'expression de JSTL est très faible dans la gestion des propriétés de collection et d'index.

7. Il est difficile de contrôler l'exécution d'une action Lorsque Struts crée une action, il sera très difficile de contrôler son ordre d'exécution. Vous devrez peut-être même réécrire le servlet pour répondre à vos exigences fonctionnelles.

8. Traitement avant et après l'exécution de l'action. Lorsque Struts traite l'action, il est basé sur des hiérarchies de classes et il est difficile d'opérer avant et après le traitement de l'action.

9. Prise en charge insuffisante des événements. Dans Struts, un formulaire correspond en réalité à une classe Action (ou DispatchAction). Autrement dit : dans Struts, un formulaire ne correspond en réalité qu'à un seul événement dans Struts, ceci. La méthode d'événement est appelée événement d'application. Comparé à l'événement de composant, l'événement d'application est un événement à granularité grossière.

12. Pourquoi utiliser le ressort (c'est-à-dire les avantages) ?

1. Spring peut organiser efficacement vos objets de niveau intermédiaire, que vous choisissiez ou non d'utiliser EJB. Si vous utilisez uniquement Struts ou d'autres frameworks spécialement conçus pour les API J2EE, Spring s'engage à résoudre le reste.

2. Spring peut éliminer l'utilisation excessive de Singleton qui est courante dans de nombreux projets. L'utilisation excessive de Singleton réduit la testabilité et l'orientation objet du système.

3. En gérant les fichiers de configuration de manière cohérente dans différentes applications et projets, Spring élimine le besoin de divers formats personnalisés de fichiers de propriétés. Vous êtes-vous déjà demandé quel attribut magique ou quelle propriété système une certaine classe recherche, et vous devez lire Javadoc ou même le code source pour cela ? Avec Spring, il vous suffit de regarder les propriétés JavaBean de la classe. L'utilisation de l'inversion de contrôle (discutée ci-dessous) permet de réaliser cette simplification.

4. En réduisant à presque rien le coût des interfaces de programmation plutôt que des cours, Spring peut favoriser le développement de bonnes habitudes de programmation.

5. Spring est conçu pour que les applications créées à l'aide de Spring dépendent le moins possible de ses API. La plupart des objets métier des applications Spring n'ont aucune dépendance sur Spring.

6. Les applications créées avec Spring sont faciles à tester unitairement.

7. Spring peut faire de l'utilisation des EJB un choix d'implémentation plutôt qu'un choix inévitable d'architecture d'application. Vous pouvez choisir d'utiliser des POJO ou des EJB locaux pour implémenter l'interface métier sans affecter le code appelant.

8. Spring vous aide à résoudre de nombreux problèmes sans utiliser d'EJB. Spring peut fournir un remplacement d'EJB, adapté à de nombreuses applications Web. Par exemple, Spring peut fournir une gestion déclarative des transactions à l'aide d'AOP sans passer par un conteneur EJB, et si vous n'avez besoin de gérer qu'une seule base de données, vous n'avez même pas besoin d'une implémentation JTA.

9. Spring fournit un cadre cohérent pour l'accès aux données, que ce soit en utilisant JDBC ou des produits de mappage O/R (tels que Hibernate).

13. Énumérez plusieurs façons que vous connaissez pour implémenter les transactions Spring

(1), Gestion programmatique des transactions : nécessite l'écriture manuelle du code, rarement utilisée dans le développement réel,

( 2), La gestion déclarative des transactions basée sur TransactionProxyFactoryBean nécessite une configuration correspondante pour chaque classe qui effectue la gestion des transactions

(3), La gestion déclarative des transactions basée sur le XML d'AspectJ, pas besoin de changer de classe, il suffit de la configurer dans le XML fichier

(4), gestion des transactions déclaratives basée sur des annotations, configuration simple, vous devez ajouter des annotations à la classe de couche métier

14, parlez du niveau d'isolement et du comportement de propagation des transactions Spring

Niveau d'isolement :

- DEFAULT utilise le niveau d'isolement par défaut de la base de données

- READ_UNCOMMITTED provoquera des lectures sales, des lectures non répétables et des problèmes de lecture fantôme

- READ_COMMITTED provoquera des lectures répétées et des lectures fantômes

- REPEATABLE_READ provoquera des lectures fantômes

- SERIALIZABLE est le plus sûr, mais le coût est le plus élevé et l'impact sur les performances est extrêmement grave

et lignes de propagation :

- OBLIGATOIRE Si la transaction existe, elle sera intégrée à la transaction. Si elle n'existe pas, elle créera la transaction

-. SUPPORTS Si la transaction existe, elle sera intégrée à la transaction. Si elle n'existe pas, la transaction ne sera pas créée

- OBLIGATOIRE Si une transaction existe, elle sera intégrée à la transaction. n'existe pas, une exception sera levée

- REQUIRES_NEW crée toujours une nouvelle transaction

- NOT_SUPPORTED Si une transaction existe, elle sera suspendue et sera toujours exécutée Opération de transaction

- N'exécute JAMAIS toujours une non-transaction, s'il y a actuellement une transaction, une exception sera levée

- Transaction intégrée NESTED

15. Qu'est-ce que le mécanisme DI ?
L'injection de dépendances (Injection de dépendances) et l'inversion de contrôle (Inversion de contrôle) sont le même concept : lorsqu'un rôle a besoin de l'aide d'un autre rôle, dans le processus de programmation traditionnel, il est généralement appelé pour créer une instance de. l'appelé.

Mais au printemps, le travail de création de l'appelé n'est plus fait par l'appelant, on parle donc d'inversion de contrôle. Le travail de création de l'appelé est effectué au printemps, puis l'appelant est injecté
c'est donc également appelé injection de dépendances.

Spring gère les objets de manière dynamique et flexible. Il existe deux modes d'injection, l'injection de réglage et l'injection de construction.
Avantages de l'injection de configuration : intuitive et naturelle
Avantages de l'injection de construction : l'ordre des dépendances peut être décidé dans le constructeur.

16. Qu'est-ce que l'AOP ?
La programmation orientée aspect (AOP) améliore l'injection de dépendances (DI) de Spring

La programmation orientée aspect se manifeste principalement sous deux aspects :
1.
2.spring prend en charge les aspects définis par l'utilisateur

Tutoriel recommandé : Démarrer avec Java

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