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<EarnMoneyServiceImpl> {

    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. 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="earnMoneyService" class="zhangyuyao.ioc.factory.service.ServiceFactory"/>
</beans>
  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实现工厂模式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值