Objectif définitif
Permettez-moi de décrire brièvement le problème que cet article souhaite résoudre: comment ne plus utiliser le ressort pour créer des instances de bean au printemps, mais transférer le processus de création de haricots aux développeurs.
Pensée claire
Comment créer une instance de haricot:
1) à travers le constructeur (avec ou sans paramètres)
Méthode: <bean id=""/>
2) à travers la méthode d'usine statique
Méthode: <bean id="" factory-method="静态工厂方法"/>
Remarque: l'instance de classe d'usine n'est pas créée
3) via la méthode d'usine d'instance (méthode non statique)
Chemin:
<bean id="factory"/>
<bean id="" factory-bean="factory" factory-method="实例工厂方法"/>
Remarque: l'instance de classe d'usine est créée
Méthode pratique
Exemple 1 :
besoin:
1 Je ne veux pas instancier le bean lorsque bean.xml est chargé, mais je veux séparer le bean chargé.xml de l'objet instancié.
2 Implémentez Singleton Bean
Dans les situations ci-dessus, les haricots peuvent être créés par la méthode d'usine.
De cette façon, lorsque Bean.xml est chargé, le bean ne sera pas instancié directement, mais commencera à être vraiment instancié lorsque la méthode mentionnée par la méthode d'usine est appelée.
Implémentation: Créez un haricot singleton via la méthode d'usine de printemps
Créez d'abord un objet singleton à travers une classe intérieure statique
package com.spring.test.factoryMethod; stade de classe publique {public void perform () {System.out.println ("show start ..."); } Private Stage () {} STACSE STATIQUE PRIVATE STACESSINGETONHOLDER {statique instance instance = new Stage (); } stade statique public getInstance () {return stagesingletonholder.instance; }}Spécifiez la méthode de chargement dans le fichier de configuration Spring GetInstance
<? xml version = "1.0" Encoding = "utf-8"?> <beans xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns = "http://www.springframe.org/schema/Beans" XSI: ScheMalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <Bean Id = "theStage" factory-method = "Getinstance">;
Obtenez une instance en appelant des haricots dans le contexte de l'application
package com.spring.test.factoryMethod; import org.springframework.context.applicationContext; import org.springframework.context.support.classpathxmlapplicationcontext; public class test {public static void main (string [] args) {applicationContext ctx = newspathxmlApplicationConCon Étape étape = ((étape) ctx.getBean ("thestage")); //. GetInstance (); stage.perform (); }}Résultats de l'exécution
24 janvier 2015 6:38:18 PM org.springframework.context.support.abstractApplicationContext PreparereFresh Informations: rafraîchissant org.springframework.context.support.classpathxmlapplicationcontext@512dbd1a: date de démarrage [SAT JAN 24 18:38:18 CST 2015]; Root of Context Hiérarchyjan 24, 2015 6:38:19 PM org.springframework.beans.factory.xml.xmlbeandefinitionReader LoadBeanDefinitions Informations: Chargement des définitions de bean XML à partir de la ressource de chemin de classe [Bean.xml] 24 janvier 2015 6:38:19 PM org.springframework.beans.factory.support.defaultListableBeanfactory PreinstantiaSingletons Informations: préinstantiant singletons dans org.springframework.beans.factory.support.defaultListableBeanFactory@2d1879ea: Defining Beans [Duke, Sonnet29, PoeticDuke, thestage] Racine de l'usine La performance de la hiérarchie commence ...
Introduction à la création de méthode d'usine Bean
1. Créez un haricot à l'aide d'une méthode d'usine statique
Lors de la création d'une instance de bean à l'aide de la méthode d'usine statique, l'attribut de classe doit également être spécifié, mais pour le moment, l'attribut de classe n'est pas la classe d'implémentation qui spécifie l'instance Bean, mais la classe d'usine statique. Parce que Spring doit savoir quelle usine utiliser pour créer l'instance de haricot. De plus, vous devez utiliser la méthode d'usine pour spécifier le nom de la méthode d'usine statique. Spring appellera la méthode d'usine statique (peut contenir un ensemble de paramètres) pour renvoyer une instance de bean. Une fois l'instance de bean spécifiée obtenue, les étapes de traitement après le printemps sont exactement les mêmes que la création de l'instance de bean à l'aide de méthodes ordinaires. Il convient de noter que lorsque vous utilisez des méthodes d'usine statiques pour créer des haricots, cette méthode d'usine doit être statique. Ce passage semble un peu étourdi, sans dire grand-chose, veuillez ajouter le code:
Définissez d'abord une interface et la méthode statique produira une instance de l'interface:
Animal d'interface publique {public void sayshello ();}Voici deux classes d'implémentation de l'interface:
classe publique Cat implémente Animal {private String msg; // La méthode du secteur requise lors de l'injection de dépendance publique void setmsg (String msg) {this.msg = msg; } @Override public void sayshello () {System.out.println (msg + ", meow ~ meow ~"); }} Classe publique Dog implémente Animal {private String msg; // La méthode du secteur requise lors de l'injection de dépendance publique void setmsg (String msg) {this.msg = msg; } @Override public void Sayshello () {System.out.println (msg + ", fort ~ Strong ~"); }}L'usine AnimalFactory ci-dessous contient une méthode statique de Getanimal, qui déterminera quel objet créera en fonction des paramètres passés. Il s'agit d'un modèle de conception d'usine statique typique.
public Clas AnimalFactory {public static animal getanimal (String Type) {if ("cat" .equalsignorecase (type)) {return new Cat (); } else {return new dog (); }}}Si vous devez spécifier que Spring utilise AnimalFactory pour générer des objets animaux, vous pouvez configurer ce qui suit dans le fichier de configuration de Spring:
<! - Configurez la méthode Getanimal de GetanimalFactory pour générer un chat -> <bean id = "Cat" Factory-Method = "Getanimal"> <! - Configurez les paramètres de la méthode d'usine statique, la méthode Getanimal générera des propresties de chat dans le setter injecta via Setter -> <pèmes "MSG" /> <! Value = "Cat" /> </ bean> <! - Configurez la méthode Getanimal de GetanimalFactory pour générer un chien -> <bean id = "chien" Factory-Method = "Getanimal"> <! - Configurez les paramètres de la méthode statique d'usine, la méthode Getanimal générera des objets de dog-type -> <constructeur-arg value = "dog" /> <! setter -> <propriété name = "msg" value = "dog" /> </bant>
À partir de la configuration ci-dessus, nous pouvons voir que la classe et la méthode d'usine des deux configurations de haricots de chat et de chien sont exactement les mêmes, car les deux instances sont générées en utilisant la même classe d'usine statique et la même méthode d'usine statique. C'est juste que les paramètres spécifiés pour cette méthode d'usine statique sont différents, utilisez l'élément <constructor-arg /> pour spécifier des paramètres pour la méthode d'usine statique.
La méthode du programme principal pour obtenir deux instances de haricots, le chat et le chien restent inchangés. Vous n'avez qu'à appeler getbean () du conteneur de ressort:
public class test {public static void main (String args []) {applicationContext context = new classPathxmlApplicationContext ("applicationContext.xml"); Animal A1 = context.getBean ("Cat", animal.class); a1.sayhello (); Animal A2 = context.getBean ("chien", animal.class); a2.sayhello (); }}Résultat de sortie:
<code> Cat, Meow ~ Meow ~ Dog, Strong ~ Strong ~ </code>
Lors de la création d'une instance à l'aide d'une méthode d'usine statique, vous devez fournir la classe d'usine et la méthode d'usine statique qui génère l'instance. Lors de la création d'une instance via une méthode d'usine statique, vous devez apporter les modifications suivantes au fichier de configuration de ressort;
L'attribut de classe n'est pas la classe d'implémentation de l'instance de bean, mais la classe d'usine statique qui génère l'instance Bean
Utilisez la méthode d'usine pour spécifier une méthode d'usine statique pour produire une instance de haricot
Si la méthode d'usine statique nécessite des paramètres, utilisez l'élément <constructor-arg /> pour le configurer
Lorsque nous spécifions que Spring utilise une méthode d'usine statique pour créer une instance de bean, Spring analyse d'abord le fichier de configuration et appellera la méthode d'usine statique de la classe d'usine statique via la réflexion en fonction des informations spécifiées par le fichier de configuration et utilise la valeur de retour de la méthode d'usine statique comme instance Bean. Dans ce processus, Spring n'est plus responsable de la création d'une instance de haricot et l'instance Bean est fournie par la méthode d'usine statique fournie par l'utilisateur.
2. Créez un haricot en utilisant la méthode d'usine d'instance
La méthode d'usine d'instance n'est qu'un peu différente de la méthode d'usine statique: appeler la méthode d'usine statique ne nécessite que l'utilisation de la classe d'usine, et appeler la méthode d'usine d'instance doit utiliser l'instance d'usine. Par conséquent, il n'y a qu'une seule différence dans la configuration de ressort: configurez la méthode d'usine statique pour spécifier la classe d'usine statique et configurez la méthode d'usine d'instance pour spécifier l'instance d'usine. Le même exemple ci-dessus modifie AnimalFactory à:
public Clas AnimalFactory {public Animal Getanimal (type de chaîne) {// Ici, le mot-clé statique n'est supprimé que si ("cat" .equalsignorecase (type)) {return new Cat (); } else {return new dog (); }}}Le fichier de printemps est modifié à:
<! - Configurez d'abord la classe d'usine -> <bean id = "AnimalFactory" /> <! - Ici, nous utilisons Factory Bean pour spécifier l'objet de classe d'usine d'instance -> <bean id = "Cat" Factory Bean = "AnimalFactory" Factory-Method = "Getanimal"> <! Value = "Cat" /> </ bean> <bean id = "dog" factory-Bean = "AnimalFactory" Factory-Method = "Getanimal"> <constructor-arg value = "dog" /> <propriété name = "msg" value = "dog" /> </ bean>
La classe de test n'a pas besoin d'être modifiée, les résultats de sortie sont les mêmes que ci-dessus.
Dans de nombreux cas, <bean id = "bean1" class = "..." /> est utilisé pour définir un haricot. De cette façon, Spring appellera le constructeur sans paramètre par défaut pour créer une instance de bean. De plus, vous pouvez également utiliser l'usine pour créer des instances de haricots pour séparer la création et l'utilisation de haricots, et remettre le travail de création de haricots à l'usine pour terminer.
Il existe trois façons de configurer les haricots d'usine.
Interface abstraite:
Interface publique IMUSICBOX {public void play (); } 1. Obtenez des exemples de haricots pour la méthode d'usine statique
Catégorie d'usine:
classe publique MusicBoxFactory {public static iMusicbox CreateMusicbox () {return new Imusicbox () {public void play () {System.out.println ("Play Piano ..."); }}; }}Fichier de configuration:
<bean id = "musicbox" factory-méthod = "CreateMusicbox" />
Classe de test:
public static void main (String [] args) {applicationContext ctx = new ClassPathXmlApplicationContext ("bean-config.xml"); IMUSICBOX MUSICBOX = (IMUSICBOX) CTX.GetBean ("Musicbox"); musicbox.play (); }2. La méthode d'instance d'usine obtient une instance de bean
Catégorie d'usine:
classe publique MusicBoxFactory {public iMusicBox CreateMusicbox () {// no modification statique renvoie de nouveaux imusicbox () {public void play () {System.out.println ("Play Piano ..."); }}; }}Fichier de configuration:
<bean id = "factorybean" /> <bean id = "musicbox" factory bean = "factorybean" factory-méthod = "CreateMusicbox" />
L'attribut "Factory-Bean" spécifie le bean d'usine, et l'attribut "Factory-Method" spécifie la méthode d'usine pour obtenir l'instance de bean.
Classe de test:
public static void main (String [] args) {applicationContext ctx = new ClassPathXmlApplicationContext ("bean-config.xml"); IMUSICBOX MUSICBOX = (IMUSICBOX) CTX.GetBean ("Musicbox"); musicbox.play (); } 3. Classe d'usine implémente org.springframework.beans.factory.facotrybean interface
Catégorie d'usine:
import org.springframework.beans.factory.factoryBean; classe publique MusicBoxFactory2 implémente FactoryBean {public objet getObject () lève une exception {return new IMusicbox () {public void play () {System.out.println ("Play Piano ..."); }}; } classe publique getObjectType () {return iMusicbox.class; } public boolean issingleton () {return false; }}Fichier de configuration:
<bean id = "musicbox" />
Classe de test:
public static void main (String [] args) {applicationContext ctx = new ClassPathXmlApplicationContext ("bean-config.xml"); // non ajouté et renvoie le "produit" de l'usine iMusicbox musicbox = (iMusicbox) ctx.getBean ("musicbox"); musicbox.play (); // Ajouter et renvoie l'objet d'instance de classe d'usine obj = ctx.getBean ("& musicbox"); System.out.println (obj.getClass (). GetName ()); }Les classes qui implémentent l'interface FactoryBean ne seront pas considérées comme des haricots ordinaires, Spring les détectera automatiquement et appellera la méthode GetObject pour obtenir l'instance de bean.
Résumer
Il s'agit de la fin de l'introduction à instanciation des instances de bean dans les méthodes d'usine de printemps. Si vous avez des lacunes, vous pouvez laisser un message pour signaler. Merci vos amis pour votre soutien pour ce site!