1.静态Bean工厂:静态方法创建对象
将对象创建过程封装到静态方法中,客户需要时调用该静态方法即可,无需关心创建的细节;
1.1 创建静态工厂方法,用户构造对象实例
abstract class Product {
// ..公共属性
}
class ProductA extends Product {
// ...
}
class ProductB extends Product {
// ...
}
class ProductCreator {
public static Product createProduct(String productId) {
if("productAA".equals(productId)){
return new ProductA();
}else if("productBB".equals(productId)) {
return new ProductB();
}
throw new IllegalArgumentException("unknow product");
}
}
1.2 通过factory-method指定工厂方法,生成bean
<bean id="aaa" class="com.yli.util.ProductCreator" factory-method="createProduct"> <constructor-arg value="productAA"></constructor-arg> </bean> <bean id="bbb" class="com.yli.util.ProductCreator" factory-method="createProduct"> <constructor-arg value="productBB"></constructor-arg> </bean>
以上过程等价于
Product aaa = ProductCreator.createProduct("productAA");
Product bbb = ProductCreator.createProduct("productBB");
2.实例Bean工厂:实例方法创建对象
将对象创建过程封装到另一个对象实例方法中,客户调用该实例方法即可,无需关心对象创建细节
2.1 创建实例对象工厂
abstract class Product {
// ..公共属性
}
class ProductA extends Product {
// ...
}
class ProductB extends Product {
// ...
}
class ProductCreator {
private Map<String, Product> products;
public void setProducts(Map<String, Product> products) {
this.products = products;
}
public Product CreateProduct(String productId) {
Product product = products.get(productId);
if(null != product) {
return product;
}
throw new IllegalArgumentException("unknow productId");
}
}
2.2 通过factory-bean和factory-method合作,创建对象实例
<bean id="productCreator" class="com.yli.util.ProductCreator">
<property name="products">
<map>
<entry key="aaa">
<bean class="com.yli.util.ProductA"></bean>
</entry>
<entry key="bbb">
<bean class="com.yli.util.ProductB"></bean>
</entry>
</map>
</property>
</bean>
<bean id="aaa" factory-bean="productCreator" factory-method="createProduct">
<constructor-arg value="aaa"></constructor-arg>
</bean>
<bean id="bbb" factory-bean="productCreator" factory-method="createProduct">
<constructor-arg value="bbb"></constructor-arg>
</bean>
以上过程等价于
ProductCreator creator = new ProductCreator();
creator.setProducts(...);
Product aaa = creator.CreateProduct("aaa");
Product bbb = creator.CreateProduct("bbb");
3.工厂Bean:非Bean工厂(包括静态域实例工厂)
工厂Bean不是普通Bean,它被当做工厂来使用:用于创建其他Bean
工厂Bean要求实现FactoryBean,Spring为此提供抽象模板AbstractFactoryBean,方便扩展
工厂Bean大多数用于实现框架功能,比如:
-
JndiObjectFactoryBean 被用于创建JNDI
-
ProxyFactoryBean 被用于创建Bean代理,广泛用于AOP
-
LocalSessionFactoryBean 被用于创建HibernateSessionFactory
-
SqlSessionFactoryBean 被用户创建Mybatis的SqlSessionFactory
3.1 创建工厂Bean
abstract class Product {
// ..公共属性
}
class ProductA extends Product {
// ...
}
class ProductB extends Product {
// ...
}
class ProductCreator extends AbstractFactoryBean<Product>{
private Product product;
public void setProduct(Product product) {
this.product = product;
}
@Override
protected Product createInstance() throws Exception {
// do more ...
return product;
}
@Override
public Class<?> getObjectType() {
return product.getClass();
}
}
3.2