Spring Bean工厂与工厂Bean

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

猜你喜欢

转载自gzuimis.iteye.com/blog/1828363