BeanFactory和FactoryBean的区别

完整的示例demo: https://github.com/runningRookie/spring-learn 运行FactoryBeanDemo中的main方法查看效果

区别
  1. BeanFactory 容器的顶层接口,定义了客户端与容器进行交互的基本契约
  2. FactoryBean 为bean实例的创建提供了扩展,实现该接口的bean,当获取该bean的时候可以根据需求得到不同的结果,一个是返回该bean实现的getObject方法返回的对象,一个是该bean本身。
FactoryBean使用示例
  1. getObject方法返回的对象的类定义
/**
 * LY.com Inc.
 * Copyright (c) 2004-2018 All Rights Reserved.
 */
package zhangyuyao.ioc.factory.service;

/**
 * @author zyy43688
 * @version $Id: EarnMoneyServiceImpl.java, v 0.1 2018年7月9日 下午2:22:22 zyy43688 Exp $
 */
public class EarnMoneyServiceImpl {

    private String name = "EarnMoneyServiceImpl";

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
  1. 实现了FactoryBean接口的类
/**
 * LY.com Inc.
 * Copyright (c) 2004-2018 All Rights Reserved.
 */
package zhangyuyao.ioc.factory.service;

import org.springframework.beans.factory.FactoryBean;
import org.springframework.lang.Nullable;

import lombok.extern.slf4j.Slf4j;

/**
 * 服务工厂
 *
 * @author zyy43688
 * @version $Id: ServiceFactory.java, v 0.1 2018年7月9日 下午2:21:18 zyy43688 Exp $
 */
@Slf4j
public class ServiceFactory implements FactoryBean {

    private String name = "ServiceFactory";

    public String getName() {
        return name;
    }

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

    @Nullable
    @Override
    public EarnMoneyServiceImpl getObject() throws Exception {
        log.info("进入getObject方法");
        return new EarnMoneyServiceImpl();
    }

    @Nullable
    @Override
    public Class getObjectType() {
        return EarnMoneyServiceImpl.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}
  1. 配置文件



    

  1. 测试类
/**
 * LY.com Inc.
 * Copyright (c) 2004-2018 All Rights Reserved.
 */
package zhangyuyao.ioc.factory;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import lombok.extern.slf4j.Slf4j;
import zhangyuyao.ioc.factory.service.EarnMoneyServiceImpl;
import zhangyuyao.ioc.factory.service.ServiceFactory;

/**
 * 工厂bean实例
 *
 * @author zyy43688
 * @version $Id: FactoryBeanDemo.java, v 0.1 2018年7月9日 下午2:20:00 zyy43688 Exp $
 */
@Slf4j
public class FactoryBeanDemo {

    public static void main(String[] args) {

        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:FactoryBeanDemo.xml");

        // 获取EarnMoneyServiceImpl实例
        EarnMoneyServiceImpl earnMoneyService = (EarnMoneyServiceImpl) context.getBean("earnMoneyService");

        // 获取ServiceFactory实例
        ServiceFactory serviceFactory = (ServiceFactory) context.getBean("&earnMoneyService");

        log.info("earnMoneyService's name is {}", earnMoneyService.getName());
        log.info("serviceFactory's name is {}", serviceFactory.getName());
    }
}

/*
* 在使用FactoryBean自定义Bean的时候可以通过ID进行Bean的注入
* 
* 如果想要直接获取FactoryBean的实例那就使用&+ID作为name获取Bean的实例
* 
* */
何时使用FactoryBean接口
  1. 针对当前需求,Spring提供的Bean的配置方式不足以,或者不方便实现
  2. 需要借助Spring实现工厂模式

你可能感兴趣的:(BeanFactory和FactoryBean的区别)