Spring Series Ten: Spring FactoryBean

Spring
Spring Series Ten: Spring FactoryBean

Перекрывая слезы и парчовые персонажи, жизнь состоит только из любви и тяжелой смерти.

Обзор

фабрикаbeanиспользуется вIoCсоздавать другие контейнерыbeanзаводской, но специфическийSpringбоб. По идее, заводbeanПодобно фабричному методу, вы можетеbeanво время строительстваSpring IoCИдентификатор контейнера, который может использоваться контейнером для создания других экземпляров.bean.

использоватьFactoryBeanСоздайтеbean

Чтобы создать фабрикуbean, нужно просто положить созданныйbeanреализация классаFactoryBeanинтерфейс, класс создаст то, что действительно нужноbean. Для простоты можно расширитьAbstractFactoryBeanДобрый.

по расширениюAbstractFactoryBeanкласс, заводBeanможно просто переписатьcreateInstance()метод создания целиBeanпример. Кроме того, вы должны быть вgetObjectType()метод возвращает цельbeanтип,springчтобы функция автоматического подключения работала должным образом.

public class EmployeeFactoryBean extends AbstractFactoryBean<Object>
{
    /This method will be called by container to create new instances
    @Override
    protected Object createInstance() throws Exception
    {
        //code
    }
 
    //This method is required for autowiring to work correctly
    @Override
    public Class<EmployeeDTO> getObjectType() {
        return EmployeeDTO.class;
    }
}

Зачем использовать фабрикуbean

фабрикаbeanВ основном используется для реализации некоторых специфических функций фреймворка. следующим образом:

  1. отJNDIПри поиске таких объектов, как источники данных, вы можете использоватьJndiObjectFactoryBean.
  2. использовать классическийSpring AOPзаbeanПри создании прокси вы можете использоватьProxyFactoryBean.
  3. существуетIoCСоздано в контейнереHibernateПри использовании фабрики сеансов вы можете использоватьLocalSessionFactoryBean.

В большинстве случаев вам вряд ли придется писать какие-либо пользовательские фабрики.bean, потому что они специфичны для фреймворка и не могут использоваться вSpring IoCИспользуется вне области действия контейнера.

FactoryBeanконтрольная работа

В этом примере я создаю фабрикуbeanдля создания экземпляров различных типовEmployeeобъекты, такие как ихmanager, directoretc имеет некоторые предварительно заполненные свойства.

EmployeeDTOкод показывает, как показано ниже:

package cn.howtodoinjava.demo.model;
 
public class EmployeeDTO {
 
    private Integer id;
    private String firstName;
    private String lastName;
    private String designation;
 
    //Setters and Getters are hidden behind this comment.
 
    @Override
    public String toString() {
        return "Employee [id=" + id + ", firstName=" + firstName
                + ", lastName=" + lastName + ", type=" + designation + "]";
    }
}

EmployeeFactoryBeanкласс наследуетAbstractFactoryBeanкласс и реализует два методаcreateInstance()а такжеgetObjectType().

import org.springframework.beans.factory.config.AbstractFactoryBean;
 
import cn.howtodoinjava.demo.model.EmployeeDTO;
 
public class EmployeeFactoryBean extends AbstractFactoryBean<Object>
{
    private String designation;
     
    public String getDesignation() {
        return designation;
    }
 
    public void setDesignation(String designation) {
        this.designation = designation;
    }
 
    //This method will be called by container to create new instances
    @Override
    protected Object createInstance() throws Exception
    {
        EmployeeDTO employee = new EmployeeDTO();
        employee.setId(-1);
        employee.setFirstName("dummy");
        employee.setLastName("dummy");
        //Set designation here
        employee.setDesignation(designation);
        return employee;
    }
 
    //This method is required for autowiring to work correctly
    @Override
    public Class<EmployeeDTO> getObjectType() {
        return EmployeeDTO.class;
    }
}

В файле конфигурации определите различныеEmployeeтипа, как показано ниже.

<bean id="manager"  class="cn.howtodoinjava.demo.factory.EmployeeFactoryBean">
    <property name="designation" value="Manager" />
</bean>
 
<bean id="director"  class="cn.howtodoinjava.demo.factory.EmployeeFactoryBean">
    <property name="designation" value="Director" />
</bean>

испытательный заводbean

public class TestSpringContext
{
    @SuppressWarnings("resource")
    public static void main(String[] args)
    {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
 
        EmployeeDTO manager = (EmployeeDTO) context.getBean("manager");
        System.out.println(manager);
         
        EmployeeDTO director = (EmployeeDTO) context.getBean("director");
        System.out.println(director);
    }
}

вывод:

Employee [id=-1, firstName=dummy, lastName=dummy, type=Manager]
Employee [id=-1, firstName=dummy, lastName=dummy, type=Director]

Как вы видете,EmployeeFactoryBeanДва разных объекта сотрудников создаются с использованием одного и того же фабричного метода.

ПолучатьFactoryBeanсам экземпляр

Если вы хотите получитьEmployeeFactoryBeanсам экземпляр, вы можетеbeanдобавить перед именем.

EmployeeFactoryBean factory = (EmployeeFactoryBean) context.getBean("&director");
 
System.out.println(factory.getDesignation());
System.out.println(factory.getObjectType());
System.out.println(factory.getObject());

вывод:

Director
 
class cn.howtodoinjava.demo.model.EmployeeDTO
 
Employee [id=-1, firstName=dummy, lastName=dummy, type=Director]

Оригинальная ссылка:Spring FactoryBean Example