前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >BeanFactory与FactoryBean的区别与联系

BeanFactory与FactoryBean的区别与联系

原创
作者头像
冰枫
发布2018-04-19 16:45:06
1.7K1
发布2018-04-19 16:45:06
举报
文章被收录于专栏:冰枫

BeanFactory顾名思义:生产和管理bean的工厂。它是IOC容器的规范接口,Spring中有很多个BeanFactory的实现,如DefaultListableBeanFactory,XmlBeanFactory,ClassPathXmlApplicationContext,ApplicationContext等等。

代码语言:javascript
复制
public interface BeanFactory {

	/** 用于区分FactoryBean与FactoryBean返回的实例
	 *  如getBean("&PeopleBeanFactory"); 将返回peopleBeanFactory实例
	 *  而getBean("peopleBeanFactory");将返回getObject()的返回对象
	 */
	String FACTORY_BEAN_PREFIX = "&";
	// 获取bean的方法
	Object getBean(String name) throws BeansException;
	<T> T getBean(String name, Class<T> requiredType) throws BeansException;
	<T> T getBean(Class<T> requiredType) throws BeansException;
	Object getBean(String name, Object... args) throws BeansException;
	<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
	// 是否存在bean
	boolean containsBean(String name);
	// 是否为单例
	boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
	//是否存在另一个实例
	boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
	//比较此bean的Class对象是否为目标Class对象
	boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException;
	// 获取bean的Class对象
	Class<?> getType(String name) throws NoSuchBeanDefinitionException;
	// 获取别名
	String[] getAliases(String name);

}

而FactoryBean,看到后缀我们应该明白它是一个Bean,那它当然也由BeanFactory来进行实例化和管理的,但是它也是Bean的工厂,为什么呢?它有什么用呢?我们来看一下这个接口

代码语言:javascript
复制
public interface FactoryBean<T> {

	// 获取对象
	T getObject() throws Exception;
	// 获取对象的Class对象
	Class<?> getObjectType();
	// 是否单例
	boolean isSingleton();

}
代码语言:javascript
复制
BeanFactory beanfactory = new ClassPathXmlApplicationContext("applicationContext.xml");
beanfactory.getBean("PeopleFactoryBean");

当你通过上面getBean()获取的对象,其实是调用的getObject()方法返回的对象。就相当于对你要返回的对象加工了一下。

例子:

代码语言:javascript
复制
public class People {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
代码语言:javascript
复制
@Component
public class PeopleFactoryBean implements FactoryBean {
    @Override
    public Object getObject() throws Exception {
       People people = new People();
       people.setName("某某");
        return people;
    }

    @Override
    public Class<?> getObjectType() {
        return People.class;
    }

    @Override
    public boolean isSingleton() {
        return false;
    }
}
代码语言:javascript
复制
public class App 
{
    public static void main(String[] args) {
        BeanFactory beanFactory = new ClassPathXmlApplicationContext("applicationContext.xml");
        People people = (People) beanFactory.getBean("peopleFactoryBean");
        System.out.println(people.getName());
    }
}

那么在预料内的话,Console打印的应该是 某某

嗯,果然是。

还记得之前BeanFactory的第一个字段吗?

代码语言:javascript
复制
String FACTORY_BEAN_PREFIX = "&";

我们如果把main函数改成这样

代码语言:javascript
复制
public class App 
{
    public static void main(String[] args) throws Exception {
        BeanFactory beanFactory = new ClassPathXmlApplicationContext("applicationContext.xml");
        PeopleFactoryBean factoryBean = (PeopleFactoryBean) beanFactory.getBean("&peopleFactoryBean");
        People people = (People) factoryBean.getObject();
        System.out.println(people.getName());
    }
}

那么获取的就是PeopleFactoryBean实例,然后通过它的getObject()方法可以获取到对应的实例

打印输出还是 某某

总结:所以说BeanFactory是来对Bean进行实例化和管理的,FactoryBean是用来对实例进行创建和修饰的。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档