(二)Spring-底层工厂创建bean

本文介绍三种工厂模式创建Bean的方法:静态工厂、实例工厂和FactoryBean。通过代码示例详细展示了如何利用这些工厂方法来初始化不同类型的Bean,并配置到Spring容器中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以前是通过框架底层工厂创建对象的,自己也可以创建工厂来创建bean对象

1、静态工厂

 

//定义静态工厂
public class MyStaticFactory {
private static Map<Integer,Book> map ;
static {
    map = new HashMap<Integer,Book>();
    map.put(100, new Book(100,"Title000","Author00",100.0));
    map.put(101, new Book(101,"Title001","Author01",200.0));
    map.put(102, new Book(102,"Title002","Author02",300.0));
}
public static Book getBookFromStaticFactory(Integer key){
    return map.get(key);
}  
}

<!-- 配置通过静态工厂方法创建的bean -->
<bean id="getBookFromStaticFactory" class="com.atguigu.spring.ioc.factory.MyStaticFactory" factory-method="getBookFromStaticFactory">
 <constructor-arg value="101"/>
     </bean>

//获取通过静态工厂方法创建的bean
Book book = (Book)ioc.getBean("getBookFromStaticFactory");
System.out.println(book); 

2、实例工厂(动态工厂)

 

//定义实例工厂
public class MyInstanceFactory {
    private Map<Integer,Book> map ;
    //动态代码块:在每一次调用构造方法前都需要执行一次。
    {
        map = new HashMap<Integer,Book>();
        map.put(100, new Book(100,"Title000","Author00",100.0));
        map.put(101, new Book(101,"Title001","Author01",200.0));
        map.put(102, new Book(102,"Title002","Author02",300.0));
    }
    public Book getBookFromInstanceFactory(Integer key){
        return map.get(key);
    } 
}

<!-- 配置通过实例工厂方法创建的bean -->
    <bean id="myInstanceFactory" class="com.atguigu.spring.ioc.factory.MyInstanceFactory"></bean>
    <bean id="getBookFromInstanceFactory" factory-bean="myInstanceFactory" factory-method="getBookFromInstanceFactory">
        <constructor-arg value="102"></constructor-arg>
    </bean>

//获取通过实例工厂方法创建的bean
Book book2 = (Book)ioc.getBean("getBookFromInstanceFactory");
System.out.println(book2)

3、factoryBean★(事物的配置就是通过此方法实现的)

//Bean的工厂,用于对Bean对象的创建 必须实现FactoryBean接口,传入泛型   
public class MyFactoryBean implements FactoryBean<Book> {
    @Override
    public Book getObject() throws Exception {
        System.out.println("getObject()...."); //如果是单例只调用一次 
        return new Book(200,"BooName01","Author01",108.0);
    }
    /*@Override  事物的factoryBean 的代码类似下面
    public SessionFactory getObject() throws Exception {
        SessionFactory sessionFactory ;
        return sessionFactory;
    }*/
    @Override
    public Class<?> getObjectType() {
        return Book.class;
    }
    @Override
    public boolean isSingleton() {
        return true; //true表示单例,false表示多例。
    }
}

<!-- 配置FactoryBean★ -->
<bean id="getBookFromFactoryBean" class="com.atguigu.spring.ioc.factory.MyFactoryBean"></bean>

//获取FactoryBean创建的对象★
Book book3 = (Book)ioc.getBean("getBookFromFactoryBean");
System.out.println(book3);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值