В чем разница между spring factory -методом и factory - bean?

Я новый Спрингс. В теге Bean я нашел factory -метод и factory - bean Атрибуты. В чем разница между factory -методом и factory - bean?

Я использую метод factory для вызова статического метода getInstance для создания объекта singleton.

Для чего используется factory - bean?


Для данных ответов я понял, что

Factory -method используется для вызова статического метода для создания объекта в том же классе Bean.

Factory - bean используется для создания объекта на основе шаблона проектирования factory.

Пример: - Я спрашиваю объект EggPlant из класса VegetableFactory (который будет возвращать объект растительного объекта, который был задан), передав мое растительное имя (EggPlant в этом случае).

Пожалуйста, исправьте, если я ошибаюсь?

Ответы

Ответ 1

В основном такая же разница между методом Factory и шаблонами дизайна Factory, с небольшим примечанием внизу. Хотя это метод, используемый для получения экземпляров определенного класса, другой является полноценным объектом, ответственным за создание объектов, включая всю необходимую логику для этого.

FactoryBean документация по интерфейсу:

Интерфейс, который будет реализован объектами, используемыми в BeanFactory, которые сами являются фабриками. Если bean реализует этот интерфейс, он используется как Factory для объекта, который открывается, а не непосредственно как экземпляр bean, который будет отображаться сам.

Кроме того, этот объект не используется как bean экземпляр, а как поставщик экземпляра через его метод getObject.


Update

Поиск использования factory-method по сравнению с FactoryBean, кажется, что он довольно часто использовал старый синглтон beans, чтобы получить базовый экземпляр, но этот подход не обеспечивает поддержку методов инициализации, таких как, например, метод init, который инициализирует заданный набор свойств.

В этом случае вы либо должны вызвать его непосредственно перед использованием класса, определите оболочку, которая обрабатывает инициализацию, либо использует другие механизмы, такие как MethodInvokingFactoryBean.


Обновление 2

Строго говоря, a FactoryBean предназначен для управления определенным типом. Фактически, у вас был бы EggPlantFactory, а не VegetableFactory, поскольку метод getObject, определенный интерфейсом FactoryBean, не поддерживает параметры.

Ответ 2

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>  

Обратите внимание, что public Printable getPrintable() of PrintableFactory.java является нестационарным методом. Обычно, если нам нужен метод доступа/вызова или другие ресурсы класса a, мы должны создать его экземпляр. Точно так же мы создали его bean. используя ссылочную переменную bean pfactory, мы вызываем метод factory getPrintable.

Ответ 3

factory -метод:
Как все уже объяснили, factory -method используется, чтобы сообщить spring использовать метод factory для создания объекта.

Примечание: статический метод является обязательным, иначе генерирует исключение.

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

factory - bean:
Когда нет статического метода и вы хотите создать объект с использованием нестационарного метода, вот трюк можно сделать с помощью factory - bean:

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

Примечание: атрибут класса не требуется в приведенном выше определении spring.

Класс:

public class ServiceFactory {

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

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

Ответ 4

Вы можете найти документацию об этом здесь. См. Разделы 3.2.3.2 и 3.2.3.3.

factory-method используется для указания статического метода в устаревшем коде, который можно использовать для создания bean.

Совсем аналогично использованию статического метода factory для создания bean, используется метод экземпляра (нестатический) factory, где метод factory существующего bean из factory вызывается для создания нового bean.

Это то, что factory-bean для.

Ответ 5

A FactoryBean используется как factory для других beans/объектов. Он не может использоваться как bean сам.

factory-method может использоваться для определения метода, который должен использоваться для создания этого bean (вместо вызова конструктора). A bean с помощью метода factory может использоваться как сам bean.

Spring может создавать экземпляры bean, используя множество разных типов factory. Это полезно, если вы хотите интегрировать библиотеки/устаревшие классы, привязанные к определенному типу.