Maison >Java >javaDidacticiel >Concept et analyse du CIO

Concept et analyse du CIO

零下一度
零下一度original
2017-07-17 13:36:201802parcourir

L'inversion de contrôle (IoC) est une fonctionnalité importante du framework et n'est pas un terme spécial pour la programmation orientée objet. Cela n'a rien à voir avec l'injection de dépendances (DI) et la recherche de dépendances.

1. Le concept d'IOC  : IOC (Inversion of Control) signifie inversion de contrôle. Nous devons d'abord comprendre ce qui est inversé. La plupart de la logique métier des programmes Java nécessite que plusieurs objets soient complétés de manière collaborative. Habituellement, lorsque chaque objet utilise son objet coopératif, il doit utiliser une syntaxe telle que new object() pour compléter l'application de l'objet coopératif. De cette manière, le couplage entre les objets est élevé. L'idée d'IOC est que le conteneur Spring implémente la création et la coordination de ces objets interdépendants. L'objet n'a qu'à se soucier de la logique métier elle-même. À cet égard, la responsabilité de la manière dont un objet obtient ses collaborateurs est inversée . En fait, IOC a un nom plus approprié appelé DI (Dependency Injection), qui signifie injection de dépendances.

Pour donner un exemple populaire : supposons qu'il existe une entreprise maintenant et que l'entreprise a besoin d'employés pour effectuer le travail correspondant, alors l'entreprise doit trouver des moyens de trouver des talents dans ce domaine pour travailler pour l'entreprise. en fonction de ses besoins. Il s'agit d'une méthode traditionnelle. Supposons que nous disposions désormais d'un site Web de recrutement. Tous les talents enregistrent leurs informations sur le site Web et notent leurs compétences et leurs domaines d'expertise. Lorsqu'une entreprise a besoin de talents, le site Web fournit des talents spécifiques à l'entreprise. l'entreprise n'a qu'à publier les exigences d'emploi. L'entreprise dans cet exemple peut être considérée comme la classe affaires EnterpriseService, et le talent est la classe d'assistance Employé dont la classe affaires a besoin pour terminer le travail. Ensuite le site de recrutement est équivalent au conteneur CIO

<code class="java"><span class="hljs-number"><span style="color: #000000"><br/>1 . 传统获取对象的方式<br/></span></span></code>
public class EnterpriseService {

    Employee employee = new Employee();//自己通过new Object()方式获取对象public void service() {
        employee.doSomething();
    }
}
<code class="java"><span class="hljs-number"><span class="hljs-keyword"><span class="hljs-class"><span class="hljs-keyword"><span class="hljs-title"><span class="hljs-keyword"><span class="hljs-comment"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-title"><span class="hljs-params"><span class="hljs-number">2 . 使用IOC容器方式<br/></span></span></span></span></span></span></span></span></span></span></span></span></span></code>
public class EnterpriseService {

    @Autowired
    Employee employee;//由容器完成对象的获取以及后续生命周期的管理public void service() {
        employee.doSomething();
    }
}

2. Analyse du principe de DI
Le principe de DI est très simple et est implémenté sur la base du mécanisme de réflexion de Java. Lorsque nous utiliserons Spring, nous aurons un fichier de configuration XML. Ce fichier est utilisé pour décrire les dépendances entre les beans. Le conteneur IOC maintient et gère tous les beans basés sur ce fichier et fournit des tâches avancées telles que la mise en cache des instances de bean, la gestion du cycle de vie, le proxy d'instance de bean, la publication d'événements et le chargement de ressources.
Lorsque IOC est démarré, il aidera à lire et à analyser les fichiers de ressources via Resource et ResourceLoader, et stockera les informations de configuration du Bean dans le fichier. Ensuite, lors de l'instanciation du Bean, il utilisera le chargeur de classe correspondant pour les appels Reflection. la méthode setter du Bean et injecte les propriétés configurées dans le fichier de configuration dans l'instance pour terminer la création de l'objet.

3. Contenu associé
1. Du point de vue de la méthode d'injection, il existe trois méthodes d'injection : Injection de constructeur, injection d'attribut, injection d'interface . Spring prend en charge l’injection de constructeur et l’injection de propriétés.
2. BeanFactory est une usine de classes, qui est l'interface principale du framework Spring Elle fournit un mécanisme de configuration IOC avancé qui facilite la gestion de différents types d'objets Java. Il est possible qu'ApplicationContext soit construit sur BeanFactory et fournisse des fonctionnalités davantage orientées vers les applications, telles que la prise en charge de l'internationalisation et le système d'événements de framework.
3. Lors du démarrage du conteneur IOC via BeanFactory, les beans définis dans le fichier de configuration ne seront pas initialisés immédiatement. L'action d'initialisation se produit lors du premier appel . Pour les Beans singleton, BeanFactory mettra en cache l'instance Bean (implémentée sur la base de HashMap), donc lorsque la méthode getBeans sera à nouveau appelée, l'instance Bean sera obtenue directement à partir du cache du conteneur IOC.
4. Les principales classes d'implémentation de ApplicationContext sont ClassPathXmlApplication et FileSystemXmlApplicationContext hérite de ApplicationContext et est spécialement préparée pour les applications Web. Elle permet la recherche et le chargement à partir de chemins relatifs au répertoire racine des applications Web. (implémenté à l'aide de l'interface Resource et de l'interface ResourceLoadera923f79d7447df2d29f7194b348e426f). La référence ServletContext peut être obtenue à partir du WebApplicationContext, et l'intégralité du WebApplicationContext sera placée dans le ServletContext en tant que propriété afin que l'environnement de l'application Web puisse accéder au contexte de l'application Spring. Trois portées de bean ont été ajoutées à l'application Web : requête, session et session globale. La méthode d'initialisation de WebApplicationContext est différente de BeanFactory et ApplicationContext, car elle nécessite une instance ServletContext, c'est-à-dire qu'elle doit avoir un conteneur Web pour terminer le travail de démarrage .
5 .Une différence majeure entre l'initialisation d'ApplicationContext et l'initialisation de BeanFactory est : ApplicationContext instancie tous les beans lors de l'initialisation du contexte d'application. Une autre différence majeure est : ApplicationContext utilisera le mécanisme de réflexion Java pour identifier automatiquement les BeanPostProcessor, InstantiationAwareBeanPostProcessor et BeanFactoryPostProcessor définis dans le fichier de configuration, et les enregistrera automatiquement dans le contexte de l'application, tandis que BeanFactory doit être transmis manuellement dans la méthode code addBeanPostProcessor() pour enregistrer .
6. Pour les beans avec scope="singleton", spring mettra en cache les beans dans le conteneur IOC, renverra la référence du bean à l'appelant et continuera à effectuer la gestion ultérieure de la vie de ces beans. Chaque fois que la méthode getBeans est appelée, le même bean est renvoyé. Pour les beans avec scope="prototype", spring n'est plus responsable de la gestion de la vie du bean après avoir renvoyé le bean à l'appelant. , un nouveau bean sera renvoyé.

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:
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