L'inversion de contrôle (IoC) et l'injection de dépendances (DI) sont deux concepts fondamentaux du Spring Framework. Traditionnellement, les objets sont responsables de la création et de la gestion de leurs propres dépendances. Cependant, IoC renverse cette responsabilité en confiant le contrôle de la création d'objets et de la gestion des dépendances à un framework comme Spring.
Ce changement offre plusieurs avantages :
IoC peut être implémenté via divers mécanismes, y compris des modèles de conception tels que le modèle d'usine, le modèle de stratégie ou le modèle de localisateur de services. Cependant, le moyen le plus courant et le plus puissant d’atteindre l’IoC consiste à utiliser l’injection de dépendances.
Dependency Injection (DI) est une technique dans laquelle le framework injecte des dépendances dans un objet plutôt que dans l'objet créant lui-même les dépendances. Il existe différents types de DI au printemps :
Par exemple, dans une classe de service simple, vous pourriez voir quelque chose comme ceci :
@Service public class OrderService { private final PaymentService paymentService; @Autowired public OrderService(PaymentService paymentService) { this.paymentService = paymentService; } public void processOrder(Order order) { paymentService.processPayment(order.getPaymentDetails()); } }
Ici, PaymentService est injecté dans OrderService via l'injection de constructeur, ce qui est généralement préféré pour ses dépendances claires et sa facilité de test.
Spring fournit un conteneur IoC chargé de gérer le cycle de vie des beans (objets gérés par Spring). L'interface de base de ce conteneur est BeanFactory. Cependant, la plupart des applications utilisent ApplicationContext, qui étend BeanFactory et offre des fonctionnalités supplémentaires.
// Getting a bean from the ApplicationContext ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); MyBean myBean = context.getBean(MyBean.class);
Dans cet exemple, ApplicationContext est utilisé pour récupérer un bean. Si vous utilisiez un BeanFactory de base, il offrirait des fonctionnalités similaires mais sans les avantages supplémentaires d'ApplicationContext.
Il existe deux manières courantes d'accéder au ApplicationContext actuel :
Autowired : injectez le ApplicationContext directement dans votre composant.
@Autowired private ApplicationContext applicationContext;
ApplicationContextAware : implémentez l'interface ApplicationContextAware, qui vous permet de récupérer l'ApplicationContext selon vos besoins.
public class MyBean implements ApplicationContextAware { private ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext context) throws BeansException { this.applicationContext = context; } }
Lorsqu'une application Spring démarre, une série d'étapes ont lieu :
Variables et propriétés de l'environnement de traitement : l'objet Environnement est créé, incorporant les paramètres de application.properties ou application.yml.
Création du ApplicationContext : le type ApplicationContext approprié est déterminé et instancié. Par exemple, une application Spring Boot peut utiliser AnnotationConfigServletWebServerApplicationContext pour les configurations basées sur Java.
Chargement des définitions de bean : Spring charge les définitions de bean à partir de plusieurs sources, telles que des classes annotées, des classes @Configuration ou des fichiers XML. Chaque définition de bean inclut des informations sur le type, la portée, les dépendances et les rappels du cycle de vie du bean.
Processing BeanFactoryPostProcessors : ces processeurs modifient les définitions des beans avant que les beans réels ne soient créés.
Résolution des dépendances et création de beans : ApplicationContext résout les dépendances et crée les beans. Si un bean a des dépendances sur d'autres beans, ces dépendances sont créées en premier.
Spring prend en charge diverses portées de bean, qui définissent le cycle de vie et la visibilité d'un bean dans le conteneur :
@Bean @Scope("prototype") public MyPrototypeBean myPrototypeBean() { return new MyPrototypeBean(); }
Dans cet exemple, une nouvelle instance de MyPrototypeBean est créée chaque fois qu'elle est demandée au conteneur.
Considérons un scénario dans lequel un bean de portée Singleton dépend d'un bean de portée Prototype. Normalement, le bean prototype ne serait créé qu'une seule fois lors de l'initialisation du singleton. Pour garantir qu'une nouvelle instance du bean prototype est fournie à chaque fois, Spring utilise des objets proxy.
@Component @Scope(value = "singleton") public class SingletonBean { @Autowired @Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS) private PrototypeBean prototypeBean; public void showMessage() { System.out.println(prototypeBean.getMessage()); } }
Ici, ScopedProxyMode.TARGET_CLASS garantit qu'une nouvelle instance de PrototypeBean est renvoyée à chaque fois que getMessage() est appelé.
Spring Boot est une extension de Spring Framework qui simplifie la configuration et le développement de nouvelles applications Spring. Il fournit :
La configuration automatique est une fonctionnalité puissante de Spring Boot qui configure de nombreuses choses pour vous en fonction des dépendances de votre chemin de classe. Ceci est contrôlé par des annotations conditionnelles telles que :
Par exemple, si vous avez Jackson sur votre chemin de classe, Spring Boot configurera automatiquement un ObjectMapper pour la sérialisation JSON :
@Configuration @ConditionalOnClass(ObjectMapper.class) public class JacksonAutoConfiguration { // Configuration details... }
Si ObjectMapper est présent, cette configuration est automatiquement appliquée. Sinon, il est ignoré.
Vous pouvez enregistrer les configurations automatiques actives au démarrage en ajoutant les éléments suivants à votre application.properties :
logging.level.org.springframework.boot.autoconfigure=DEBUG
Cela générera un rapport détaillé indiquant quelles configurations ont été appliquées et lesquelles ne l'ont pas été, vous aidant à dépanner ou à comprendre la configuration de l'application.
L'inversion de contrôle et l'injection de dépendances sont des concepts fondamentaux qui permettent la flexibilité, la modularité et la testabilité qui rendent Spring si puissant. En comprenant comment fonctionne le conteneur IoC de Spring, comment les beans sont gérés et comment Spring Boot étend ces fonctionnalités, vous pouvez développer plus efficacement des applications robustes et maintenables.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3