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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值