Перекрывая слезы и парчовые персонажи, жизнь состоит только из любви и тяжелой смерти.
Обзор
фабрика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
. - использовать классический
Spring
AOP
заbean
При создании прокси вы можете использоватьProxyFactoryBean
. - существует
IoC
Создано в контейнереHibernate
При использовании фабрики сеансов вы можете использоватьLocalSessionFactoryBean
.
В большинстве случаев вам вряд ли придется писать какие-либо пользовательские фабрики.bean
, потому что они специфичны для фреймворка и не могут использоваться вSpring
IoC
Используется вне области действия контейнера.
FactoryBean
контрольная работа
В этом примере я создаю фабрикуbean
для создания экземпляров различных типовEmployee
объекты, такие как ихmanager
, director
etc имеет некоторые предварительно заполненные свойства.
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