Перекрывая слезы и парчовые персонажи, жизнь состоит только из любви и тяжелой смерти.
Обзор
фабрика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В основном используется для реализации некоторых специфических функций фреймворка. следующим образом:
- от
JNDIПри поиске таких объектов, как источники данных, вы можете использоватьJndiObjectFactoryBean. - использовать классический
SpringAOPзаbeanПри создании прокси вы можете использоватьProxyFactoryBean. - существует
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