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

FactoryBean解析

作者头像
爱撒谎的男孩
发布2019-12-31 16:07:17
4430
发布2019-12-31 16:07:17
举报
文章被收录于专栏:码猿技术专栏码猿技术专栏

文章目录

  1. 1. 简介
  2. 2. 接口解析
  3. 3. 自定义实现
  4. 4. 源码解析

简介

  • 简单的说FactoryBean实际上是一个Bean,并不是一个工厂,它能够为我们创建一个Bean,但是创建的这个Bean实际指向的并不是FactoryBean类型的,而是其中getObject方法返回类型的对象。

接口解析

  • FactoryBean中有三个需要实现的方法,如下:
    • getObject() :获取返回的对象,此处返回的对象会被注入到ioc容器中
    • public Class<?> getObjectType():返回创建Bean类型
    • public boolean isSingleton():返回是否创建单例,如果返回true,那么创建的对象将是单例的,返回false,创建的是多实例的对象。

自定义实现

  • 自定义一个FactoryBean,实现Admin的注入,如下:
代码语言:javascript
复制
/**
 * 自定义FactoryBean,用来创建对象
 * 1、@Component :将创建的MyFactoryBean注入到容器中
 * 2、实现FactoryBean
 * 3、指定泛型<T>
 */
@Component
public class MyFactoryBean implements FactoryBean<Admin> {
    @Override
    public Admin getObject() throws Exception {
        System.out.println("创建Admin");
        return new Admin();
    }
    @Override
    public Class<?> getObjectType() {
        return Admin.class;
    }
    @Override
    public boolean isSingleton() {
        return true;
    }
}
  • 此时即可从容器中获取到对应的Bean了,如下:
代码语言:javascript
复制
@Test
public void testFactoryBean(){
    //根据id获取实例,这里实际获取的是getObject返回的对象
    Admin admin1 = applicationContext.getBean("myFactoryBean", Admin.class);
    System.out.println(admin1);
}
  • 以上是获取的实例Bean,现在我们就想获取MyBeanFactory本身这个对象,可以在id的前面加上&即可,如下:
代码语言:javascript
复制
@Test
public void testFactoryBean2(){
    //根据&id获取实例,实际获取的就是MyFactoryBean的对象
    MyFactoryBean bean = applicationContext.getBean("&myFactoryBean", MyFactoryBean.class);
    System.out.println(bean);
}

源码解析

  • 指定的是FactoryBean的id,为什么获取的是getObject返回的对象?
    • 简单的逻辑:判断传入的类型是否是FactoryBean类型,如果是该类型的,调用getObject方法返回对象即可。
    • 在源码中可以看到调用的是org.springframework.beans.factory.support.FactoryBeanRegistrySupport#doGetObjectFromFactoryBean方法
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-06-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

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