web-dev-qa-db-fra.com

Quelle est la différence entre la méthode d'usine du printemps et la fève d'usine?

Je suis nouveau Springs. Dans la balise Bean, j'ai trouvé les attributs de méthode d'usine et de bean d'usine. Quelle est la différence entre la méthode d'usine et le bean d'usine?

J'utilise la méthode d'usine pour appeler ma méthode statique getInstance pour créer un objet singleton.

À quoi sert le grain d'usine?


Pour les réponses données, ce que j'ai compris était

La méthode d'usine est utilisée pour appeler une méthode statique pour créer un objet dans la même classe de bean.

Factory-bean est utilisé pour créer un objet basé sur un modèle de conception d'usine.

Ex: - Je demande un objet EggPlant à la classe VegetableFactory (qui retournera l'objet végétal demandé) en passant mon nom de légume (EggPlant dans ce cas).

Veuillez corriger si je me trompe?

23
Sarma

C'est fondamentalement la même différence entre les méthodes de conception Factory et Factory , avec une petite note en bas. Alors que l'un est une méthode utilisée pour obtenir des instances d'une classe spécifique, l'autre est un objet à part entière chargé de créer des objets, y compris toute la logique requise pour le faire.

La documentation de l'interface de FactoryBean indique:

Interface à implémenter par des objets utilisés au sein d'une BeanFactory qui sont eux-mêmes des usines. Si un bean implémente cette interface, il est utilisé comme une fabrique pour un objet à exposer, pas directement comme une instance de bean qui sera exposée elle-même.

De plus, cet objet n'est pas utilisé comme instance de bean, mais comme fournisseur d'instance via sa méthode getObject.


Mise à jour

Recherche d'utilisations de factory-method sur un FactoryBean, il semble qu'il soit utilisé assez souvent avec les beans singleton hérités, pour obtenir l'instance sous-jacente, mais cette approche ne prend pas en charge les méthodes d'initialisation, comme, par exemple, un init méthode qui initialise un ensemble donné de propriétés.

Dans ce cas, vous devez soit l'invoquer vous-même avant d'utiliser la classe, définir un wrapper qui gère l'initialisation ou utiliser d'autres mécanismes tels que MethodInvokingFactoryBean.


Update 2

À strictement parler, un FactoryBean est destiné à gérer un type spécifique. Vous auriez en fait un EggPlantFactory, pas un VegetableFactory puisque la méthode getObject définie par l'interface FactoryBean ne prend pas en charge les paramètres.

11
Fritz
factory-method: represents the factory method that will be invoked to inject the bean.
factory-bean: represents the reference of the bean by which factory method will be invoked. It is used if factory method is non-static.

Printable.Java

package com.javatpoint;  
public interface Printable {  
    void print();  
}  

A.Java

package com.javatpoint;  
public class A implements Printable{  
    @Override  
    public void print() {  
        System.out.println("hello a");  
    }      
} 

B.Java

package com.javatpoint;  
public class B implements Printable{  
    @Override  
    public void print() {  
        System.out.println("hello b");  
    }  
}  

PrintableFactory.Java

package com.javatpoint;  
public class PrintableFactory {  
    //non-static factory method  
    public Printable getPrintable(){  
        return new A();//return any one instance, either A or B  
    }  
}  

applicationContext.xml

<?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:p="http://www.springframework.org/schema/p"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans   
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  

<bean id="pfactory" class="com.javatpoint.PrintableFactory"></bean>  
<bean id="p" class="com.javatpoint.Printable" factory-method="getPrintable"   
factory-bean="pfactory"></bean>  

</beans>  

Notez que public Printable getPrintable() de PrintableFactory.Java Est un méthode non statique. Généralement, si nous voulons une méthode d'accès/appel ou d'autres ressources de la classe a, nous devons créer son instance. De même en ce que nous l'avons créé bean. en utilisant la variable de référence du bean pfactory nous appelons la méthode d'usine getPrintable.

17

méthode d'usine:
Comme tout le monde l'a déjà expliqué, méthode d'usine est utilisé pour dire au ressort d'utiliser la méthode d'usine pour instancier l'objet.

Remarque: la méthode statique est obligatoire sinon une exception est levée.

<bean id="serviceFactory" class="com.test.controller.ServiceFactory" factory-method="getServiceFacrotyWithStaticMethod"/>

bean d'usine:
Lorsqu'il n'y a pas de méthode statique et que vous voulez toujours créer l'objet en utilisant une méthode non statique, voici l'astuce qui peut être faite en utilisant factory-bean:

<bean id="instanceWithOutStaticMethod" factory-bean="serviceFactory" factory-method="getInstanceWithOutStaticMethod" />

Remarque: aucun attribut de classe requis dans la définition de ressort ci-dessus.

Classe:

public class ServiceFactory {

    public static ServiceFactory getServiceFacrotyWithStaticMethod(){
        return new ServiceFactory();
    }

    public SdCard getInstanceWithOutStaticMethod(){
        return new AdaptorSlot("laptop");
    }
}
10
Jagadeesh

Vous pouvez trouver documentation à ce sujet ici . Voir les sections 3.2.3.2 et 3.2.3.3.

factory-method est utilisé pour pointer vers une méthode statique dans le code hérité qui peut être utilisée pour créer un bean.

L'utilisation d'une méthode de fabrique d'instance (non statique), où une méthode de fabrique d'un bean existant de la fabrique est appelée pour créer le nouveau bean, est assez similaire à l'utilisation d'une méthode de fabrique statique pour créer un bean.

C'est quoi factory-bean est pour.

3
Daniel Kaplan

Un FactoryBean est utilisé comme usine pour d'autres beans/objets. Il ne peut pas être utilisé comme bean lui-même.

Le factory-method peut être utilisé pour définir la méthode qui doit être utilisée pour créer ce bean (au lieu d'appeler le constructeur). Un bean avec une méthode d'usine peut être utilisé comme bean lui-même.

Spring peut créer des instances de bean en utilisant de nombreux types de fabriques différents. Ceci est utile si vous souhaitez intégrer des bibliothèques/classes héritées liées à un type particulier.

2
micha

au printemps, nous utilisons la méthode d'usine car dans Java classe prédéfinie et certains utilisent la classe define sont là ils ne sont pas fournis directement pour créer l'objet d'une autre classe il y a une classe abstraite nous ne pouvons pas créer d'objet mais à côté de la classe il y a une méthode comme la classe Calendar on ne peut pas créer l'objet de la classe Calendar

Calendar cal = new Calendar(); 

c'est faux à ce moment là son erreur donne mais c'est fournir la méthode getInstance() on peut appeler la méthode et on peut instance la classe

Exemple:

Calendar cal=Calendar.getInstance();  

il est correct à cette époque, nous utilisons la méthode d'usine dans l'exemple du printemps:

<bean id="cal" class="Calendar" factory-method="getInstance">
1
Hemant vyas