IOC容器-静态工厂和实例工厂

前言

对于通过类名在配置文件中配置Bean是再普通不过的配置了,Spring的实例工厂方法和静态工厂方法都可以用来实例化bean,接下来我们就来看看相关实例

1. bean的创建模式就是框架利用反射new出来的bean实例
2. 工厂模式:替代了我们自己去new的过程,有一个专门替我们创建对象的类
3 .静态工厂:工厂本身不用创建对象,通过静态方法调用,对象类=工厂类.工厂方法名
4. 实例工厂:工厂本身需要创建对象 工厂类

工厂类 工厂实例=new 工厂类();
工厂实例.工厂方法名;

###静态工厂

直接调用静态方法可以返回Bean的实例

#####1.实体类

package com.xiamu.bean;

public class Book {

    private String name;
    private String author;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    @Override public String toString() {
        return "Book{" + "name='" + name + '\'' + ", author='" + author + '\'' + '}';
    }
}

2.静态工厂类
package com.xiamu.factory;

import com.xiamu.bean.Book;

import java.util.HashMap;
import java.util.Map;

public class BookStaticFactor {

    private static Map<String, Book> books = new HashMap();

    static {
        books.put("book1", new Book("朝花夕拾", "鲁迅"));
        books.put("book2", new Book("平凡的世界", "路遥"));
    }

    public static Book getBook(String author) {
        System.out.println("获取book实例");
        return books.get(author);
    }
}

3.application.xml
  <!-- 1.静态工厂(不需要创建工厂本身)factory 2.factory-method 指定哪个方法是工厂方法
       3.class:指定静态工厂全类名-->
    <bean id="book1" class="com.xiamu.factory.BookStaticFactor" factory-method="getBook">
        <!-- 为方法指定参数-->
        <constructor-arg value="book1"></constructor-arg>
    </bean>

4.测试类
public class SpringTest {

    ApplicationContext ioc = new ClassPathXmlApplicationContext("application.xml");

    @Test public void getBook() {
        Book book = (Book)ioc.getBean("book1");
        System.out.println(book);
    }
}

输出结果:

获取book实例
Book{name='朝花夕拾', author='鲁迅'}

实例工厂

1.实例工厂类
package com.xiamu.factory;

import com.xiamu.bean.Book;

import java.util.HashMap;
import java.util.Map;

public class BookInstanceFactory {
    private Map<String, Book> books = new HashMap();

    public BookInstanceFactory() {
        books.put("book1", new Book("朝花夕拾", "鲁迅"));
        books.put("book2", new Book("平凡的世界", "路遥"));
    }

    public Book getBook(String author) {
        System.out.println("获取book实例");
        return books.get(author);
    }
}

2.application.xml
 <!--先配置出实例工厂对象-->
    <bean id="bookFactory" class="com.xiamu.factory.BookInstanceFactory"></bean>

    <!--通过实例方法配置bean
    factory-bean:指定使用哪个工厂(实例工厂)
    factory-method 指定哪个方法是工厂方法
    -->
    <bean id="book2" factory-bean="bookFactory" factory-method="getBook">
        <constructor-arg value="book2"></constructor-arg>
    </bean>
3.测试
 @Test public void getBook() {
        Book book = (Book)ioc.getBean("book2");
        System.out.println(book);
    }
}

输出结果:

获取book实例
Book{name='平凡的世界', author='路遥'}

实现FactoryBean接口

1.实现FactoryBean接口
package com.xiamu.factory;

import com.xiamu.bean.Book;
import org.springframework.beans.factory.FactoryBean;

/**
 * 实现了FactoryBean接口的类是Spring都可以认识的工厂类;
 * Spring会自动调用工厂方法创建实例
 * <p>
 * 1.编写实现类
 * 2.配置文件中注册
 */
public class BookFactoryBeanImpl implements FactoryBean<Book> {
    /**
     * 工厂方法  spring自动调用  返回创建的对象
     */
    public Book getObject() throws Exception {
        System.out.println("bookFactoryBeanImpl 帮你创建对象...");
        Book book = new Book("斗破苍穹", "天蚕土豆");
        return book;
    }

    /**
     * 返回创建的对象类型
     * Spring会自动调用这个方法创建对象是什么类型
     */
    public Class<?> getObjectType() {

        return Book.class;
    }

    /**
     * 是单例吗?
     * true  是
     * false 不是
     */
    public boolean isSingleton() {
        return true;
    }
}

2.application.xml
  <!-- FactoryBean *(是Spring规定的一个接口);
         只要是这个接口的实现类,Spring都认为是一个工厂
         ioc容器启动不会创建实例
         FactoryBean:获取的时候才会创建对象-->
    <bean id="bookFactoryBeanImpl" class="com.xiamu.factory.BookFactoryBeanImpl"></bean>

3.输出结果
bookFactoryBeanImpl 帮你创建对象...
Book{name='斗破苍穹', author='天蚕土豆'}

实现FactoryBean接口
1.ioc容器启动不会创建实例
2.FactoryBean:获取的时候才会创建对象

以上就是本文关于Spring的实例工厂和静态工厂全部内容,希望对大家有所帮助,如有不足之处,欢迎留言指出

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值