Récemment, j'ai acheté ce livre d'introduction au printemps: SpringInaction. J'ai parcouru grossièrement et je me sentais plutôt bien. Juste un peu de démarrage. Les livres de Manning sont toujours bons. Bien que je ne me concentre pas sur Manning comme ceux qui ne lisent que les livres Manning, je l'ai lu avec la révérence et la passion. Encore une fois, j'ai accepté les concepts de base du printemps tels que le CIO, DI et AOP. Permettez-moi de parler d'abord de mon opinion sur le CIO et le DI.
IOC (DI): En fait, le concept de l'architecture de printemps de base n'est pas si compliqué, et il n'est pas aussi obscur que décrit dans certains livres. Les programmeurs Java savent tous que chaque logique métier dans un programme Java nécessite au moins deux objets ou plus pour collaborer. Généralement, lorsque chaque objet utilise son objet partenaire, il doit utiliser une syntaxe comme NewObject () pour terminer le travail d'application de l'objet partenaire. Vous constaterez que le couplage entre les objets est élevé. L'idée du CIO est: les conteneurs de printemps pour réaliser la création et la coordination de ces objets interdépendants. Les objets doivent seulement avoir une logique commerciale relationnelle elle-même. À cet égard, la responsabilité de la façon dont un objet obtient son objet collaboratif est inversé (IOC, DI).
Ceci est mon expérience de l'IOC du printemps. DI est en fait une autre façon de dire IOC. DI a été proposé pour la première fois par Martin Fowler dans un article au début de 2004. Il a conclu: Qu'est-ce que le contrôle est inversé? C'est-à-dire: la façon d'obtenir des objets dépendants est inversée.
Si vous ne comprenez pas encore ce concept de base: nous citons ici une réponse simple et facile à comprendre trouvée sur un blog appelé Bromon:
IOC et DI
Tout d'abord, je veux parler du CIO (inversionofControl, Control Inversion). C'est le cœur du printemps, partout. Pour le cadre du printemps, le printemps est responsable du contrôle du cycle de vie d'un objet et de la relation entre les objets. Qu'est-ce que cela signifie? Pour donner un exemple simple, comment trouver une petite amie? Une situation commune est que nous allons partout pour voir où nous avons de belles et belles femmes, puis de nous renseigner sur leurs intérêts, les numéros QQ, les numéros de téléphone, les numéros de propriété intellectuelle, les numéros de QI ..., trouver des moyens de les connaître, de leur donner ce qu'ils aiment, puis hehe ... ce processus est complexe et profond, et nous devons concevoir et faire face à chaque lien nous-mêmes. Il en va de même pour le développement de programmes traditionnels. Dans un objet, si vous souhaitez utiliser un autre objet, vous devez l'obtenir (nouveau par vous-même, ou en interroger un de JNDI). Après utilisation, l'objet doit être détruit (comme la connexion, etc.), et l'objet sera toujours combiné avec d'autres interfaces ou classes.
Alors, comment le IOC le fait-il? C’est un peu comme trouver une petite amie par le biais d’une agence de mariage et présenter un tiers entre moi et ma petite amie: une agence de mariage. L'agence de mariage gère beaucoup d'informations sur les hommes et les femmes. Je peux fournir une liste à l'agence de mariage et lui dire quel type de petite amie je veux trouver, comme ressembler à Michelle Reis, avoir une silhouette comme Lin Xilei, chanter comme Jay Chou, avoir une vitesse comme Carlos et avoir une technologie comme Zidane. Ensuite, l'agence de mariage fournira un MM conformément à nos exigences. Nous avons juste besoin de tomber amoureux et de nous marier. C'est simple et clair. Si les candidats qui nous sont donnés ne répondent pas aux exigences, nous lancerons une exception. L'ensemble du processus n'est plus contrôlé par moi, mais est contrôlé par une institution de type conteneur comme une agence de mariage. Il s'agit de la méthode de développement préconisée par le printemps. Toutes les classes seront enregistrées dans le conteneur de printemps pour dire à Spring ce que vous êtes et ce dont vous avez besoin. Ensuite, Spring vous donnera ce que vous voulez lorsque le système fonctionne au niveau approprié, et en même temps vous remettre à d'autres choses qui ont besoin de vous. Toutes les classes sont créées et détruites par le printemps, ce qui signifie que l'objet qui contrôle le cycle de vie d'un objet n'est plus l'objet qui le fait référence, mais le printemps. Pour un objet spécifique, il avait l'habitude de contrôler d'autres objets, mais maintenant tous les objets sont contrôlés par le ressort, donc cela s'appelle l'inversion de contrôle.
L'un des points clés du CIO est de fournir dynamiquement un objet avec d'autres objets dont il a besoin pendant le fonctionnement du système. Ceci est réalisé par DI (dépendanceInjection). Par exemple, l'objet A doit faire fonctionner la base de données. Dans le passé, nous avons toujours écrit du code dans A pour obtenir un objet de connexion. Avec le printemps, nous devons seulement dire au printemps qu'une connexion est nécessaire en A. quant à la construction de cette connexion et quand la construire, A n'a pas besoin de savoir. Lorsque le système est en cours d'exécution, Spring créera une connexion au moment approprié, puis l'injectera en une injection comme une injection, terminant ainsi le contrôle de la relation entre chaque objet. A doit s'appuyer sur la connexion pour s'exécuter normalement, et cette connexion est injectée dans un par printemps, et le nom de l'injection de dépendance en vient. Alors, comment DI est-il mis en œuvre? Une caractéristique importante après Java 1.3 est la réflexion, qui permet au programme de générer dynamiquement des objets, d'exécuter des méthodes d'objets et de modifier les propriétés des objets lors de l'exécution. Le printemps est injecté par réflexion. Pour des informations connexes sur la réflexion, veuillez vous référer à Javadoc.
Après avoir compris les concepts du CIO et du DI, tout deviendra simple et clair, et le reste du travail est juste d'empiler des blocs dans le cadre du printemps.
Apprenons comment fonctionne le printemps.
public static void main (String [] args) {applicationContext context = new FileSystemXmlApplicationContext ("applicationContext.xml"); Animal animal = (animal) context.getBean ("animal"); animal.say (); }Vous devez être familier avec ce code, mais analysons-le. Tout d'abord, applicationContext.xml
<bean id = "animal"> <propriété name = "name" value = "kitty" /> </ank>
Il a une classe phz.springframework.test.cat
classe publique Cat implémente Animal {Nom de la chaîne privée; public void Says () {System.out.println ("I Am" + Name + "!");} public void setName (String name) {this.name = name;}}Implémenté l'interface phz.springframework.test.animal
Animal d'interface publique {public void saye (); }De toute évidence, le code ci-dessus sort iamkitty!
Alors, comment le printemps fait-il?
Ensuite, écrivons nous-mêmes un printemps pour voir comment fonctionne le printemps!
Tout d'abord, nous définissons une classe de haricots, qui est utilisée pour stocker des propriétés appartenant à un haricot
/ * ID Bean * / ID de chaîne privée; / * Classe Bean * / Type de chaîne privée; / * Propriété bean * / map privé <string, objet> Properties = new HashMap <String, objet> ();
Un haricot comprend l'ID, le type et les propriétés.
Le printemps prochain commence à charger notre fichier de configuration et enregistre les informations de configuration dans un hashmap. La clé de Hashmap est l'ID du Bean et la valeur de Hasmap est le bean. Ce n'est que de cette manière que nous pouvons obtenir la classe animale via la méthode context.getBean ("Animal"). Nous savons tous que la spirng peut injecter des types de base et peut injecter des types comme la liste et la carte. Ensuite, prenons la carte comme exemple pour voir comment le printemps est sauvé
La configuration de la carte peut être comme ce qui suit
<bean id = "test"> <propriété name = "testmap"> <map> <entrée key = "a"> <value> 1 </value> </ entry> <entrée key = "b"> <value> 2 </value> </ntry> </aph> </prophed> </anEn>
Comment Spring enregistre-t-il la configuration ci-dessus? Le code est le suivant:
if (beanproperty.element ("map")! = null) {map <string, object> propertiesmap = new hashmap <string, object> (); Element PropertiesListMap = (élément) beanproperty.Elements (). Get (0); Iterator <?> PropertiESiterator = PropertiesListMap.Elements (). Iterator (); while (propertiesiterator.hasnext ()) {élément vet = (élément) propertiesiterator.next (); if (veT.getName (). equals ("entrée")) {string key = vet.attributeValue ("key"); Iterator <?> ValueSiterator = Vet.Elements (). Iterator (); while (valeursiterator.hasnext ()) {element value = (élément) valedIterator.next (); if (value.getName (). equals ("value")) {PropertiesMap.put (key, value.getText ()); } if (value.getName (). equals ("ref")) {PropertiesMap.put (key, new String [] {value.attributeValue ("bean")}); }}}} bean.getProperties (). put (nom, propriétésmap); }Ensuite, allons à la partie principale. Voyons comment le printemps est l'injection de dépendance. En fait, l'idée de l'injection de dépendance est également très simple. Il est mis en œuvre par le mécanisme de réflexion. Lors de l'instanciation d'une classe, il injecte les attributs de classe stockés dans hashmap dans la classe en reflétant la méthode définie dans la classe. Voyons comment cela se fait.
Instancier d'abord une classe, comme celle-ci
Objet statique public NewInstance (String className) {class <?> CLS = null; objet obj = null; try {cls = class.forname (className); obj = cls.newinstance ();} catch (classNotFoundException e) {lancer un nouveau runtimexception (e);} catch (instancexception e) (IllégalAccessException e) {lancer un nouveau RuntimeException (e);} return obj;}Ensuite, il y injecte les dépendances de cette classe, comme celle-ci
public static void setProperty (objet obj, nom de chaîne, valeur de chaîne) {class <? Extend Object> Clazz = obj.getClass (); try {String MethodName = returnSetMThodName (name); méthode [] ms = Clazz.getMethods (); pour (méthode m: ms) {if (m.getName (). M.GetParameterTypes () [0]; setFieldValue (ClazzParameterType.getName (), Value, M, Obj); Break;}}}} Catch (SecurityException E) {Throw RuntimeException (E);} Catch (illégalargumentException E) Nouveau RuntimeException (E);}}Enfin, il nous renvoie une instance de cette classe et nous pouvons l'utiliser. Prenons la carte comme exemple pour voir comment cela se fait. Le code que j'ai écrit est de créer un hashmap et d'injecter le hashmap dans la classe qui doit être injectée, comme celle-ci
if (valeur instanceof map) {iterator <?> EntryiTerator = ((map <?,?>) value) .EntrySet (). iterator (); Map <string, object> map = new hashmap <string, object> (); while (Entryiterator.hasnext ()) {entrée <?,?> EntryMap = (entrée <?,?>) Entryiterator.next (); if (entryMap.getValue () instanceof string []) {map.put ((string) entryMap.getKey (), getBean ((string []) entryMap.getValue ()) [0])); }} Beanprocesser.setProperty (obj, propriété, map); }OK, nous pouvons donc utiliser Spring pour créer la classe pour nous. N'est-ce pas difficile? Bien sûr, le printemps peut faire plus que cela. Cet exemple de programme ne fournit qu'une partie de la fonction d'injection de dépendance la plus principale de Spring.
Cet article a fait référence à un grand nombre d'articles et ne peut pas vous remercier un par un. Merci ici ensemble. Je m'excuse pour votre violation du droit d'auteur. J'espère que ce sera utile à tous!
Résumer
Ce qui précède est tout le contenu de cet article sur l'explication détaillée des principes du Spring IOC, et j'espère que cela sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à ce site:
Une brève compréhension des exemples de Spring, AOP et de code
Introduction détaillée à la mise en œuvre de la simulation IOC de Spring
S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!