FactoryBean的使用

简介: 为什么有的beanName前面有个&?BeanFactory和FactoryBean有什么区别?

FactoryBean的使用

​ 一般情况下,Spring通过反射机制利用用户指定的class来实例化Bean,但有的情况下实例化Bean过程比较复杂,如果使用需要大量配置,或者使用@Bean在注释方法中需要写大量代码。Spring为此给我们提供了一个org.springframework.bean.factory.FactoryBean<T>的工程类接口,用户可以实现该接口用于实例化一个类的逻辑,然后把实现FactoryBean的类交个Spring。

public interface FactoryBean<T> {
      boolean isSingleton(); //由FactoryBean创建的bean是 singleton还是prototype
  
      Class<?> getObjectType(); //获取FactoryBean创建的bean类型
  
    T getObject() throws Exception; //返回FactoryBean创建的bean实例,如果isSingleton()返回为true,则该实例会被放到Spring单例缓冲池中
}

注意:

​ 当我们注册一个FactoryBean类型到Spring容器中后,再去获取FactoryBean对应bean时,返回的类型不是FactoryBean,而是FactoryBean创建的对象,如果要获取FactoryBean本身,那要加上前缀&.

class Dog{
    public String name = "dog";
}

//实现FactoryBean接口,用于创建Dog的bean
class DogFactoryBean implements FactoryBean<Dog>{
    @Override
    public Dog getObject() throws Exception {
        return new Dog();
    }
    @Override
    public Class<?> getObjectType() {
        return Dog.class;
    }
    @Override
    public boolean isSingleton() {
        return true;
    }
}

public class SpringDemo {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext 
          = new AnnotationConfigApplicationContext();
        applicationContext.register(DogFactoryBean.class); //注册一个FactoryBean类型
        applicationContext.refresh();

          //获取刚刚注册的DogFactoryBean,实际返回的是DogFactoryBean创建的Dog
        Object dog = applicationContext.getBean("dogFactoryBean");
        System.out.println(dog);// 打印结果com.example.Dog@480bdb19

        //加上&就可以获取刚刚注册的DogFactoryBean
        Object dogFactoryBean = applicationContext.getBean("&dogFactoryBean");
        System.out.println(dogFactoryBean);// 打印结果com.example.DogFactoryBean@2a556333
    }
}
目录
相关文章
|
关系型数据库 数据库 PostgreSQL
|
8月前
|
虚拟化 iOS开发 MacOS
VMware ESXi 7.0U3s macOS Unlocker & OEM BIOS 2.7 Intel 网卡特殊定制版
VMware ESXi 7.0U3s macOS Unlocker & OEM BIOS 2.7 Intel 网卡特殊定制版
196 7
VMware ESXi 7.0U3s macOS Unlocker & OEM BIOS 2.7 Intel 网卡特殊定制版
|
Web App开发 前端开发 JavaScript
网页浏览和编辑DWG快速入门的方法(WEB CAD SDK)
MxDraw云图在线CAD解决方案,包括MxDraw、MxCAD开发包、图纸转换程序和后端服务。支持多种平台和CPU架构,推荐使用最新版Chrome或Edge浏览器。提供AutoCAD各版本dwg格式支持,具备三维和二维编辑功能。提供入门开发指南和功能丰富的示例。用户可下载开发包进行功能演示,包括在线预览和编辑CAD图纸。
1788 93
网页浏览和编辑DWG快速入门的方法(WEB CAD SDK)
|
存储 前端开发 JavaScript
使用JavaScript实现复杂功能——一个交互式音乐播放器
使用JavaScript实现复杂功能——一个交互式音乐播放器
|
达摩院 供应链 Cloud Native
低代码这么火,它的人才认证你考了吗?
2021年超级🔥 的证书!限时免费认证中……
8947 0
低代码这么火,它的人才认证你考了吗?
|
存储 SpringCloudAlibaba Java
springcloud alibaba(1)
springcloud alibaba
287 0
|
Apache Windows
Apache No installed service named “Apache2.4“的解决办法
Apache No installed service named “Apache2.4“的解决办法
484 0
ps2023软件最新中文免费版下载Photoshop
Photoshop简介:Photoshop2023是一款专业级的图像处理软件,ps有很多功能,在图像、图形、文字、视频、出版等各方面都有涉及,广泛应用于平面设计、图标制作、婚纱照片设计、影像创意、绘画等各个领域。
1777 0
|
JavaScript 前端开发 开发者
各种模块化方案的解释-AMD-CMD-Module
各种模块化方案的解释-AMD-CMD-Module
189 0
|
弹性计算 网络安全 网络虚拟化
使用阿里云VPN网关打通本地服务器局域网和云上专有网络VPC的方法
阿里云VPN网关和本地服务器固定IP组建局域网如何操作?
5697 0
使用阿里云VPN网关打通本地服务器局域网和云上专有网络VPC的方法