完整的示例demo: https://github.com/runningRookie/spring-learn 运行FactoryBeanDemo中的main方法查看效果
区别
- BeanFactory 容器的顶层接口,定义了客户端与容器进行交互的基本契约
- FactoryBean 为bean实例的创建提供了扩展,实现该接口的bean,当获取该bean的时候可以根据需求得到不同的结果,一个是返回该bean实现的getObject方法返回的对象,一个是该bean本身。
FactoryBean使用示例
- 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;
}
}
- 实现了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;
}
}
- 配置文件
<?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>
- 测试类
/**
* 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接口
- 针对当前需求,Spring提供的Bean的配置方式不足以,或者不方便实现
- 需要借助Spring实现工厂模式