FactoryBean解析

文章目录

  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的注入,如下:
/**
 * 自定义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了,如下:
@Test
public void testFactoryBean(){
    //根据id获取实例,这里实际获取的是getObject返回的对象
    Admin admin1 = applicationContext.getBean("myFactoryBean", Admin.class);
    System.out.println(admin1);
}
  • 以上是获取的实例Bean,现在我们就想获取MyBeanFactory本身这个对象,可以在id的前面加上&即可,如下:
@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方法

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Struts2之获取请求参数

    爱撒谎的男孩
  • Spring依赖注入

    爱撒谎的男孩
  • 设计模式之原型模式

    爱撒谎的男孩
  • 设计模式几大原则

    单一职责原则(Single Responsibility Principle,SRP):一个类只负责一个功能领域中的相应职责或可以定义为:就一个类而言,应该只有...

    孟君
  • java设计模式之代理模式

    代理模式 代理模式是常见设计模式的一种,代理模式的定义是:为其他对象提供一种代理以控制对这个对象的访问。 在某些情况下,一个对象不适合或者不能直接引用另一个对象...

    纪莫
  • Java反射机制与动态代理

    Java 反射机制与动态代理我们平时写代码可能用得比较少,但在各种常见的框架(Spring、MyBatis 等)中却屡见不鲜。有句话叫“无反射,不框架;无代理,...

    WriteOnRead
  • SpringSecurity-短信验证码接口开发

    有时候我们需要有特殊登录形式,比如说短信验证码登录。他与验证码登录逻辑是不一样的,所以不能使用Spring Security默认提供的那套逻辑;需要自个去写一个...

    好好学java
  • C++获取private的变量-偷走private

    private提供了对数据的封装,使得private成员只能被类自身的成员函数以及类的友元访问,其他的函数或者类想要访问private成员只能通过该类所提供的s...

    magicsoar
  • 设计模式在外卖营销业务中的实践

    业务策略多变导致需求多变,是业界很多技术团队面临的最具挑战的问题之一。那么如何设计一套易于扩展和维护的营销系统呢?

    美团技术团队
  • springboot配置之yaml

    3、springboot默认有两种配置springboot配置的方式,一种就application.properties,另一种就是application.ym...

    绝命生

扫码关注云+社区

领取腾讯云代金券