重疊淚痕緘錦字,人生只有情難死。java
工廠bean
是用做在IoC
容器中建立其餘bean
的工廠,但它是特定的Spring
的bean。從概念上講,工廠bean
很是相似於工廠方法,能夠在bean
構造期間由Spring
IoC
容器標識,而且能夠由容器用來實例化其餘bean
。spring
FactoryBean
建立bean
要建立工廠bean
,你只須要把建立的bean
類實現FactoryBean
接口,該類將建立實際所須要的bean
。簡單起見,您能夠擴展AbstractFactoryBean
類。app
經過擴展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
主要用於實現框架某些特定功能。以下:ide
JNDI
查找對象(例如數據源)時,可使用JndiObjectFactoryBean
。Spring
AOP
爲bean
建立代理時,可使用ProxyFactoryBean
。IoC
容器中建立Hibernate
會話工廠時,可使用LocalSessionFactoryBean
。在大多數狀況下,你幾乎沒必要編寫任何自定義工廠bean
,由於它們框架的特定功能的,而且不能在Spring
IoC
容器範圍以外使用。測試
FactoryBean
測試在這個例子中,我正在建立一個工廠bean
來實例化不一樣類型的Employee
對象,例如他們的manager
, director
等具備一些預先填充的屬性。ui
EmployeeDTO
代碼以下:this
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()
。spa
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]
複製代碼