Je déconstruire comment le printemps gère les objets Java avec un exemple simple.
Tout d'abord, définissez un simple POJO, le code est le suivant:
package com.jvk.ken.spring; public class Demo {private String Name; public Demo () {name = "I'm Demo.";} public void printName () {System.out.println (name);} public void setName (String name) {this.name = name;}}}Le fichier de configuration de ressort correspondant est le suivant:
<? xml version = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: context = "http://www.springframework.org/schema/context" xsi: schemalocation = "http://www.springframework.org/schema/context http://www.springframework.org/schema/contex http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-eans-3.1.xsd "> <eb id =" Demo "
Le code de test simple est le suivant:
package com.jvk.ken.spring; import org.springframework.beans.factory.beanfactory; import org.springframework.beans.factory.xml.xmlbeanfactory; import org.springframework.core.oio.classpathersource; test public {public static sticon {TestSpring ();} private static void TestSpring () lève une exception {beanfactory bf = new XMLBeanFactory (new ClassPathResource ("applicationContext.xml")); Demo Bean = (DeMo) bf.getBean ("Demo"); System.out.println (Bean.getClass ()); Bean.print (););Exécutez la classe de test et sortez les informations suivantes, indiquant qu'un simple exemple de ressort a été exécuté avec succès.
2012-3-28 22:18:07 org.springframework.beans.factory.xml.xmlbeAndefinitionReader LoadBeanDefinitions Informations: Chargement des définitions de bean XML de la classe de la classe [applicationContext.xml] Class com.jvk.ken.spring.demo I'memo.
À partir du code de configuration du code Java court et du XML, nous pouvons voir que XMLBeanFactory assemble JavaBean en lisant le fichier de configuration XML et renvoie l'objet requis lorsque l'utilisateur appelle la méthode GetBean. Pour imiter son comportement, je définis un simple haricot.
package com.jvk.ken.spring; import java.util.hashmap; import java.util.map; public class mybeanfactory {// enregistrer la définition de la carte bean <chaîne, class> beans = new hashmap <string, class> (); public objet getbean (string id) lance l'instancexception, illégalaccessException { beans.get (id) .newInstance ();} String privé xmlfile; public myBeanFactory (String xmlfile) lève ClassNotFoundException {super (); this.xmlfile = xmlfile; init ();} private void init () lève classNotFoundException {// initialiser et analyser xml, l'analyse réelle de xml est omise ici, et utilise du code dur pour imiter System.out.println ("Fichier de configuration:" + xmlfile); String classname = "com.jvk.ken.spring.demo"; classe <?> LoadClass = this.getClass (). GetClassOader (). LoadClass (className); Beans.put ("Demo", LoadClass);}}Le code de test est le suivant:
Package com.jvk.ken.spring; Public Class Test {public static void main (String [] args) lève une exception {TestNotsPring ();} private static void testNotsPring () lève une exception {MyBeanFactory BF = new MyBeanFactory ("applicationContext.xml"); Demo Bean = (Demo) bf.getBean ("Demo"); System.out.println (bean.getClass ()); bean.printName ();}}Après l'exécution, les informations suivantes sont la sortie:
Fichier de configuration: applicationcontext.xml classe com.jvk.ken.spring.demo je suis démo.
Le code court ci-dessus montre comment Spring agit comme l'usine de haricots la plus simple. Ajustez légèrement le code ci-dessous pour analyser ce qui se passe au printemps. Tout d'abord, modifiez la méthode de construction sans paramètres de la classe de démonstration en privé.
Demo privé () {name = "Je suis démo."; }L'exécution du code de test a révélé qu'il n'y avait pas de différence dans les résultats des tests de printemps, mais mon MyBeanFactory personnalisé a rapporté le message d'erreur suivant:
Exception dans Thread "Main" Java.lang.ILLEGALACCESSException: Class com.jvk.ken.spring.mybeanfactory ne peut pas accéder à un membre de la classe com.jvk.ken.spring.demo avec les modificateurs "privé" sur sun.reflect.reflection.enseremememAccess (réflexion.java:65) à SUN.reflect.reflection. java.lang.class.newinstance0 (class.java:349) sur java.lang.class.newinstance (class.java:308) à com.jvk.ken.spring.mybeanfactory.getbean (mybeanfactory.java:12) at com.jvk.ken.spring.test.testNotspring (test.java:25) sur com.jvk.ken.spring.test.main (test.java:9)
Le printemps est si magique? Non, le code que j'ai écrit est tout simplement trop simple et peut être exécuté directement avec une légère modification.
L'objet public getBean (String id) lève l'exception {class class1 = beans.get (id); Constructor DeclatedConstructor = class1.getDeclaredConstructor (); DeclatedConstructor.SetAccessible (true); rendement déclaré Constructor.NewInstance (); }Ce qui précède est le Javabean le plus pur géré par le conteneur de printemps. Spring prend également en charge un autre type de haricot, appelé Factory Bean, l'exemple est meilleur que mille mots, veuillez consulter le code
Package com.jvk.ken.spring; import org.springframework.beans.factory.factoryBean; classe publique Demofactory implémente FactoryBean {@Override Object public getObject () lève exception {return Demo ();} @ Override Class public GetObjectType () {return DeMo.Class;} @ overnide public boofean Criesilleton () @} @ overnide public boolean ISSINGLETO FAUX;}}Après avoir ajouté la classe de démofactoire, modifiez le fichier de configuration de ressort en même temps
<bean id = "démo" />
Les autres codes ne sont pas modifiés. Après avoir exécuté le code de test, les résultats de sortie sont exactement les mêmes qu'auparavant. Pourquoi la classe com.jvk.ken.spring.demofactory avec ID est-elle configurée, mais le résultat renvoyé est une instance de démonstration? En effet, Spring détecte que la démofactoire est un bean spécial qui implémente l'interface FactoryBean. La méthode GetObject sera appelée avant de renvoyer le résultat, donc le résultat final est l'objet de démonstration. Bien sûr, si nous avons vraiment besoin d'obtenir le haricot d'usine, nous pouvons écrire bf.getBean ("& Demo") comme celui-ci.
Résumer
Ce qui précède est toute l'explication détaillée du code de création d'objets de soumission de mise en œuvre du printemps, j'espère que cela sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à d'autres sujets connexes sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!