系列十四、BeanFactory vs FactoryBean vs ApplicationContext

本文详细解释了Spring框架中的BeanFactory和FactoryBean的概念、继承结构以及它们在bean创建过程中的作用,包括ApplicationContext的区别和使用场景。通过实例展示了如何自定义bean的创建过程和实际应用.
摘要由CSDN通过智能技术生成

一、BeanFactory

1.1、概述

        IOC思想是基于IOC容器完成的,IOC容器的底层就是对象工厂,其核心接口为BeanFactory,BeanFactory是一个工厂类,负责生产和管理各种各样的bean,也是Spring内部的使用接口,不提供给开发人员使用,它的主要职责就是生产bean以及建立各个bean之间的关系,它在加载配置文件的时候不会创建对象,在获取(创建)对象的时候才会创建对象,BeanFactory只是一个接口,并不是IOC的具体实现,Spring给出了很多种实现,如下:

1.2、继承结构

二、FactoryBean

2.1、概述

        FactoryBean是一个接口,也是一个bean,但它并不是一个简单的bean,而是一个能够生产或者修饰对象生成的工厂bean,它最大的作用是能让我们自定义bean的创建过程。

2.2、核心方法

2.3、FactoryBean创建对象案例

2.3.1、Car.java

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/11/24 17:01
 * @Description:
 */
@Component
@Data
public class Car implements Serializable, FactoryBean<Car> {
    private String name;
    private String description;
 
    public Car() {
        System.out.println("Car的无参构造执行了...");
    }
    public Car(String name, String description) {
        this.name = name;
        this.description = description;
        System.out.println("Car的有参构造执行了...");
    }
 
    @Override
    public Car getObject() throws Exception {
        Tank tank = new Tank("东风0001","加满油能跑1000公里","中国");
        return tank;
    }
 
    @Override
    public Class<?> getObjectType() {
        return Tank.class;
    }
}

2.3.2、Tank.java

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/11/24 17:03
 * @Description:
 */
@Component
@ToString(callSuper = true)
public class Tank extends Car {
    /**
     * 产地
     */
    private String producer;
 
    public Tank() {
        System.out.println("Tank的无参构造执行了...");
    }
 
    public Tank(String name, String description, String producer) {
        super(name, description);
        this.producer = producer;
        System.out.println("Tank的有参构造执行了...");
    }
 
    public String getProducer() {
        return producer;
    }
 
    public void setProducer(String producer) {
        this.producer = producer;
    }
}

2.3.3、MySpringConfig.java

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/11/23 11:41
 * @Description:
 */
@Configuration
@ComponentScan(basePackages = "org.star")
public class MySpringConfig {
}

2.3.4、测试

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/11/23 11:24
 * @Description:
 */
public class Spring5x03MainApp {
 
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MySpringConfig.class);
       
        Tank tank = context.getBean("car", Tank.class);
        System.out.println("tank = " + tank);
    }
 
}

三、ApplicationContext 

3.1、概述

        ApplicationContext是BeanFactory接口的子接口,提供了更多更强大的功能,一般由开发人员进行使用。加载配置文件的时候就会对配置文件中的对象进行创建,继承结构如下所示:

3.2、继承结构

3.3、ApplicationContext vs FactoryBean

        FactoryBean真正生产bean,ApplicationContext不生产bean,而是通知FactoryBean来进行生产。可以理解为汽车4S店和汽车厂之间的关系;真正生产汽车的是汽车厂,4S店只是一个门面,两者相辅相成,4S店负责为用户提供服务,工厂负责生产汽车。部分源码如下:

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MySpringConfig.class);
ATM atm = context.getBean("atm", ATM.class);

3.4、使用场景 

        FactoryBean 和 ApplicationContext虽然都可以作为容器管理bean,但是俗话说"物尽其责,人尽其用",每个角色都应该做自己最擅长的事儿,所以通常情况下FactoryBean用于生产bean,ApplicationContext用于门面和程序员打交道,提供更为强大的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值