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