Table des matières
1. Description " >1. Description
2.2 基于Setter的依赖注入" >2.2 基于Setter的依赖注入
2.3 基于属性的依赖注入" >2.3 基于属性的依赖注入
3.1 Les champs immuables ne peuvent pas être déclarés " >3.1 Les champs immuables ne peuvent pas être déclarés
3.2 Il est facile de violer le principe de conception à responsabilité unique" >3.2 Il est facile de violer le principe de conception à responsabilité unique
3.3 Étroitement couplé au conteneur d'injection de dépendances " >3.3 Étroitement couplé au conteneur d'injection de dépendances
3.4 Dépendances cachées " >3.4 Dépendances cachées
Maison Java javaDidacticiel Pourquoi les grandes entreprises interdisent-elles l'utilisation de l'annotation @Autowired dans les projets Spring Boot ?

Pourquoi les grandes entreprises interdisent-elles l'utilisation de l'annotation @Autowired dans les projets Spring Boot ?

Aug 15, 2023 pm 04:00 PM
spring boot

1. Description


La société a récemment mis à niveau le framework par rapport à l'original <span style=" contour : 0px ; 3.0 <code style=" margin-right: rgba mono consolas monaco menlo monospace break-all rgb visible><span style="outline: 0px;font-size: 16px;visibility: visible;">spring framerwork 3.0</span></span>升级到<span style="outline: 0px;font-size: 16px;visibility: visible;">5.0</span>Mise à niveau vers <span style="outline: 0px;font-size: 16px;visibility: visible;">5.0</span>, et puis quand j'écrivais le code , j'ai soudainement découvert que l'idée était que l'annotation @Autowired

pour l'injection d'attributs donne un avertissement, comme celui ci-dessous, ce qui est assez déroutant après tout, c'est écrit comme ça depuis de nombreuses années.

L'injection sur le terrain n'est pas recommandée

Pourquoi les grandes entreprises interdisent-elles l'utilisation de l'annotation @Autowired dans les projets Spring Boot ?

🎜🎜🎜

J'ai vérifié les documents pertinents et découvert que cette invite a commencé à apparaître après <code style="outline: 0px;visibility: visible;"><span style="outline: 0px;font-size: 16px;visibility: visible;">spring framerwork 4.0</span>以后开始出现的,spring 4.0开始就不推荐使用属性注入,改为推荐构造器注入和setter注入。

下面将展示了spring框架可以使用的不同类型的依赖注入,以及每种依赖注入的适用情况。


2、依赖注入的类型

尽管针对<span style="outline: 0px;font-size: 16px;">spring framerwork 5.1.3</span>spring framework 4.0, mais elle n'apparaîtra pas après Spring 4.0 est recommandé, et l'injection de constructeur et l'injection de setter sont recommandées à la place.

🎜🎜🎜Ce qui suit montrera les différents types d'injection de dépendances qui peuvent être utilisés par le framework Spring, ainsi que les situations applicables de chaque injection de dépendance. 🎜🎜🎜
🎜

2. Types d'injection de dépendances🎜🎜

🎜Bien que la documentation de 🎜🎜spring framework 5.1.3🎜🎜 ne définisse que deux types principaux d'injection de dépendances, il y en a en fait trois ;🎜 🎜Injection de dépendances basée sur un constructeur : 0px; " > L'injection de dépendances basée sur le champ

  • est largement utilisée, mais les outils d'analyse d'idées ou d'autres outils d'analyse de code statique donneront des messages rapides et ne sont pas recommandés.
    Vous pouvez même voir cette méthode d'injection dans certains guides officiels de Spring :
  • 2.1 Injection de dépendances basée sur un constructeur
  • Dans l'injection de dépendances basée sur un constructeur, construction de classe La fonction est annotée @ Autowired et contient un certain nombre de paramètres liés à l’objet à injecter.

@Component
public class ConstructorBasedInjection {

    private final InjectedBean injectedBean;

    @Autowired
    public ConstructorBasedInjection(InjectedBean injectedBean) {
        this.injectedBean = injectedBean;
    }
}
Copier après la connexion
Ensuite, dans la documentation officielle du printemps, l'annotation @Autowired peut également être omise. <span style="outline: 0px;font-size: 16px;">基于字段的依赖注入</span>
public class SimpleMovieLister {

    // the SimpleMovieLister has a dependency on a MovieFinder
    private MovieFinder movieFinder;

    // a constructor so that the Spring container can inject a MovieFinder
    public SimpleMovieLister(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }

    // business logic that actually uses the injected MovieFinder is omitted...
}
Copier après la connexion

基于构造函数注入的主要优点是可以将需要注入的字段声明为final, 使得它们会在类实例化期间被初始化,这对于所需的依赖项很方便。

2.2 基于Setter的依赖注入

在基于setter的依赖注入中,setter方法被标注为 @Autowired。一旦使用无参数构造函数或无参数静态工厂方法实例化Bean,为了注入Bean的依赖项,Spring容器将调用这些setter方法。

@Component
public class SetterBasedInjection {

    private InjectedBean injectedBean;

    @Autowired
    public void setInjectedBean(InjectedBean injectedBean) {
        this.injectedBean = injectedBean;
    }
}
Copier après la connexion

和基于构造器的依赖注入一样,在官方文档中,基于Setter的依赖注入中的 @Autowired也可以省去。

public class SimpleMovieLister {

    // the SimpleMovieLister has a dependency on the MovieFinder
    private MovieFinder movieFinder;

    // a setter method so that the Spring container can inject a MovieFinder
    public void setMovieFinder(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }

    // business logic that actually uses the injected MovieFinder is omitted...
}
Copier après la connexion

2.3 基于属性的依赖注入

在基于属性的依赖注入中,字段/属性被标注为 @Autowired。一旦类被实例化,Spring容器将设置这些字段。

@Component
public class FieldBasedInjection {
    @Autowired
    private InjectedBean injectedBean;
}
Copier après la connexion

正如所看到的,这是依赖注入最干净的方法,因为它避免了添加样板代码,并且不需要声明类的构造函数。代码看起来很干净简洁,但是正如代码检查器已经向我们暗示的那样,这种方法有一些缺点。


3. Défauts d'injection de dépendances basées sur le champ

3.1 Les champs immuables ne peuvent pas être déclarés

L'injection de dépendances basée sur le champ sur les champs déclarés comme finaux/ immuable Cela ne fonctionne pas car ces champs doivent être instanciés lorsque la classe est instanciée. La seule façon de déclarer des dépendances immuables est d’utiliser l’injection de dépendances basée sur le constructeur.

3.2 Il est facile de violer le principe de conception à responsabilité unique

Dans la programmation orientée objet, les cinq principes de conception SOLID sont largement utilisés (généralement six principes de conception en Chine) pour améliorer la réutilisabilité du code. Lisibilité, fiabilité et maintenabilité

S dans SOLID représente le principe de responsabilité unique, c'est-à-dire qu'une classe ne devrait être responsable que d'une seule responsabilité, et tous les services fournis par cette classe ne devraient être responsables que de la responsabilité dont elle est responsable. pour Servir.

En utilisant l'injection de dépendances basée sur le champ, pour les classes fréquemment utilisées, au fil du temps, nous ajouterons progressivement de plus en plus de dépendances à la classe. Nous en sommes très satisfaits, et il est facile d'ignorer les dépendances dans la classe. . Mais si vous utilisez l'injection de dépendances basée sur le constructeur, à mesure que de plus en plus de dépendances sont ajoutées à la classe, le constructeur deviendra de plus en plus grand et nous pouvons dire d'un coup d'œil que quelque chose ne va pas.

Avoir un constructeur avec plus de 10 paramètres est un signe clair que la classe s'est transformée en une collection vaste et complète de fonctionnalités et doit être divisée en morceaux plus petits et plus maintenables.

Ainsi, même si l’injection de propriété n’est pas une cause directe de violation du principe de responsabilité unique, elle cache des signaux et nous permet de les ignorer facilement.

3.3 Étroitement couplé au conteneur d'injection de dépendances

La principale raison d'utiliser l'injection de dépendances basée sur le champ est d'éviter le code standard pour les getters et les setters ou la création de constructeurs pour les classes. En fin de compte, cela signifie que la seule façon de définir ces champs est d'instancier la classe via le conteneur Spring et de les injecter en utilisant la réflexion, sinon les champs resteront nuls.

Le modèle de conception d'injection de dépendance dissocie la création de dépendances de classe de la classe elle-même et transfère cette responsabilité au conteneur d'injection de classe, permettant à la conception du programme d'être découplée et de suivre les principes de responsabilité unique et d'inversion de dépendance (tout aussi fiables). Par conséquent, le découplage de la classe obtenu par les champs de câblage automatique est finalement perdu en le couplant à nouveau au conteneur d'injection de classe (Spring dans ce cas), rendant ainsi la classe inutile en dehors du conteneur Spring.

Cela signifie que si vous souhaitez utiliser votre classe en dehors du conteneur d'application, par exemple pour des tests unitaires, vous serez obligé d'utiliser le conteneur Spring pour instancier votre classe puisqu'il n'y a pas d'autre moyen possible (sauf la réflexion) de mettre en place champs de câblage automatique.

3.4 Dépendances cachées

Lors de l'utilisation de l'injection de dépendances, la classe affectée doit clairement exposer ces dépendances à l'aide d'une interface publique, en exposant les dépendances requises dans le constructeur, ou en utilisant des méthodes (setters) pour exposer les dépendances facultatives. Lors de l’utilisation de l’injection de dépendances basée sur le champ, ces dépendances sont essentiellement cachées au monde extérieur.


4. Résumé

Nous avons vu qu'il fallait éviter autant que possible l'injection sur le terrain car elle présente de nombreux inconvénients, aussi élégante soit-elle. L’approche recommandée consiste à utiliser l’injection de dépendances basée sur le constructeur et sur le setter.

Pour les dépendances requises, il est recommandé d'utiliser l'injection basée sur le constructeur, de les rendre immuables et d'empêcher qu'elles soient nulles. Pour les dépendances facultatives, il est recommandé d’utiliser une injection basée sur un setter.

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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

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)

Spring Boot+MyBatis+Atomikos+MySQL (avec code source) Spring Boot+MyBatis+Atomikos+MySQL (avec code source) Aug 15, 2023 pm 04:12 PM

Dans les projets réels, nous essayons d'éviter les transactions distribuées. Cependant, il est parfois vraiment nécessaire de procéder à un fractionnement des services, ce qui entraînera des problèmes de transactions distribuées. Dans le même temps, des transactions distribuées sont également demandées sur le marché lors des entretiens. Vous pouvez vous entraîner avec ce cas et parler de 123 lors de l'entretien.

Bénéficiez d'un support multilingue et d'applications internationales grâce à Spring Boot Bénéficiez d'un support multilingue et d'applications internationales grâce à Spring Boot Jun 23, 2023 am 09:09 AM

Avec le développement de la mondialisation, de plus en plus de sites Web et d'applications doivent fournir un support multilingue et des fonctions d'internationalisation. Pour les développeurs, la mise en œuvre de ces fonctions n’est pas une tâche facile car elle nécessite de prendre en compte de nombreux aspects, tels que la traduction linguistique, les formats de date, d’heure et de devise, etc. Cependant, grâce au framework SpringBoot, nous pouvons facilement implémenter un support multilingue et des applications internationales. Tout d’abord, comprenons l’interface LocaleResolver fournie par SpringBoot. Lieu

Comment utiliser Spring Boot pour créer des applications blockchain et des contrats intelligents Comment utiliser Spring Boot pour créer des applications blockchain et des contrats intelligents Jun 22, 2023 am 09:33 AM

Avec l’essor des monnaies numériques telles que Bitcoin, la technologie blockchain est progressivement devenue un sujet brûlant. Les contrats intelligents peuvent être considérés comme un élément important de la technologie blockchain. SpringBoot, en tant que framework de développement back-end Java populaire, peut également être utilisé pour créer des applications blockchain et des contrats intelligents. Cet article explique comment utiliser SpringBoot pour créer des applications et des contrats intelligents basés sur la technologie blockchain. 1. SpringBoot et blockchain Tout d'abord, nous devons comprendre certains concepts de base liés à la blockchain. Chaîne de blocs

Comment utiliser Spring Boot pour créer des applications de traitement de Big Data Comment utiliser Spring Boot pour créer des applications de traitement de Big Data Jun 23, 2023 am 09:07 AM

Avec l’avènement de l’ère du Big Data, de plus en plus d’entreprises commencent à comprendre et à reconnaître la valeur du Big Data et à l’appliquer à leurs activités. La question qui se pose est de savoir comment gérer ce flux important de données. Dans ce cas, les applications de traitement du Big Data sont devenues quelque chose que chaque entreprise doit prendre en compte. Pour les développeurs, comment utiliser SpringBoot pour créer une application efficace de traitement du Big Data est également une question très importante. SpringBoot est un framework Java très populaire qui permet

Créer un système ESB à l'aide de Spring Boot et Apache ServiceMix Créer un système ESB à l'aide de Spring Boot et Apache ServiceMix Jun 22, 2023 pm 12:30 PM

Alors que les entreprises modernes s’appuient de plus en plus sur une variété d’applications et de systèmes disparates, l’intégration d’entreprise devient encore plus importante. Enterprise Service Bus (ESB) est un modèle d'architecture d'intégration qui connecte différents systèmes et applications entre eux pour fournir des services communs d'échange de données et de routage de messages afin de réaliser l'intégration des applications au niveau de l'entreprise. En utilisant SpringBoot et ApacheServiceMix, nous pouvons facilement créer un système ESB. Cet article explique comment l'implémenter. SpringBoot et A

Implémenter le mappage ORM basé sur Spring Boot et MyBatis Plus Implémenter le mappage ORM basé sur Spring Boot et MyBatis Plus Jun 22, 2023 pm 09:27 PM

Dans le processus de développement d'applications Web Java, la technologie de mappage ORM (Object-RelationalMapping) est utilisée pour mapper les données relationnelles de la base de données avec des objets Java, ce qui facilite l'accès et l'exploitation des données par les développeurs. SpringBoot, en tant que l'un des frameworks de développement Web Java les plus populaires à l'heure actuelle, a fourni un moyen d'intégrer MyBatis, et MyBatisPlus est un framework ORM étendu sur la base de MyBatis.

Système de mise en cache et de stockage de données distribué basé sur Spring Boot Système de mise en cache et de stockage de données distribué basé sur Spring Boot Jun 22, 2023 am 09:48 AM

Avec le développement et la vulgarisation continus d'Internet, la demande en matière de traitement et de stockage de données augmente également. La manière de traiter et de stocker les données de manière efficace et fiable est devenue un sujet brûlant parmi l'industrie et les chercheurs. Le système distribué de mise en cache et de stockage des données basé sur SpringBoot est une solution qui a beaucoup retenu l'attention ces dernières années. Qu'est-ce qu'un système distribué de mise en cache et de stockage de données ? Les systèmes de mise en cache et de stockage de données distribuées font référence au stockage distribué de données via plusieurs nœuds (serveurs), ce qui améliore la sécurité et la fiabilité des données et peut également améliorer le traitement des données.

Intégration et utilisation de Spring Boot et base de données NoSQL Intégration et utilisation de Spring Boot et base de données NoSQL Jun 22, 2023 pm 10:34 PM

Avec le développement d’Internet, l’analyse des mégadonnées et le traitement de l’information en temps réel sont devenus un besoin important pour les entreprises. Afin de répondre à de tels besoins, les bases de données relationnelles traditionnelles ne répondent plus aux besoins du développement commercial et technologique. Au lieu de cela, l’utilisation de bases de données NoSQL est devenue une option importante. Dans cet article, nous aborderons l'utilisation de SpringBoot intégré aux bases de données NoSQL pour permettre le développement et le déploiement d'applications modernes. Qu'est-ce qu'une base de données NoSQL ? NoSQL n'est pas seulement du SQL

See all articles