今天给大家介绍@FactoryBean注解用法,希望对大家能有所帮助!

1、@FactoryBean注解介绍

FactoryBean是实现了FactoryBean<T>接口的Bean,可以该Bean的ID从BeanFactory中获取的实际上是FactoryBean中getObject()方法返回的实例对象,而并不是直接FactoryBean本身,想要获取FactoryBean对象本身,可以在id前面加一个&符号来获取。

BeanFactory部分代码:

说明:String FACTORY_BEAN_PREFIX = "&" ,&符号表示要获取FactoryBean本身

package org.springframework.beans.factory;import org.springframework.beans.BeansException;
import org.springframework.core.ResolvableType;
import org.springframework.lang.Nullable;public interface BeanFactory {String FACTORY_BEAN_PREFIX = "&";}

2、@FactoryBean的源码内容如下:

Spring3.0版本之后,FactoryBean开始支持泛型,即接口声明改为FactoryBean<T>的形式

package org.springframework.beans.factory;import org.springframework.lang.Nullable;public interface FactoryBean<T> {String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";@NullableT getObject() throws Exception;@NullableClass<?> getObjectType();default boolean isSingleton() {return true;}
}

实现FactoryBean<T>接口有一下三个方法

  • getObject:获取bean对应的实例对象

  • getObjectType:获取factoryBean获取到的实例类型

  • isSingleton:factoryBean创建的实例是否是单实例

3、用法示例

3.1 新建Book.java

package com.spring.bean;public class Book {private String bookName;private String bookType;private double price;public Book(String bookName, String bookType, double price) {this.bookName = bookName;this.bookType = bookType;this.price = price;}public String getBookName() {return bookName;}public void setBookName(String bookName) {this.bookName = bookName;}public String getBookType() {return bookType;}public void setBookType(String bookType) {this.bookType = bookType;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}@Overridepublic String toString() {return "Book{" +"bookName='" + bookName + '\'' +", bookType='" + bookType + '\'' +", price=" + price +'}';}
}

3.2 新建BookFactoryBean.java

package com.spring.bean;import org.springframework.beans.factory.FactoryBean;public class BookFactoryBean implements FactoryBean<Book> {public BookFactoryBean factoryBeanVO() {return new BookFactoryBean();}public Book getObject() throws Exception {return new Book("红楼梦", "中国名著", 88);}public Class<?> getObjectType() {return Book.class;}public boolean isSingleton() {return true;}
}

3.3 FactoryBeanConfig.java

package com.spring.config;import com.spring.bean.BookFactoryBean;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class FactoryBeanConfig  {@Beanpublic BookFactoryBean bookFactoryBean(){return new BookFactoryBean();}
}

3.4 TestFactoryBean.java

package com.spring.test;import com.spring.config.FactoryBeanConfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class TestFactoryBean {public static void main(String[] args) {AnnotationConfigApplicationContext annotationContext = new AnnotationConfigApplicationContext(FactoryBeanConfig.class);// 获取工厂类的beanObject bookFactoryBean = annotationContext.getBean("bookFactoryBean");System.out.println(bookFactoryBean.getClass());// 输出结果:class com.spring.bean.Book//获取FactoryBean 本身 加 &符号Object bookFactoryBean1 = annotationContext.getBean("&bookFactoryBean");System.out.println(bookFactoryBean1.getClass());// 输出结果:class com.spring.bean.BookFactoryBean}
}

4、@FactoryBean应用场景

  • 单一的对象使用FactoryBean意义不大。

  • 创建对象时需要依赖于需要别的接口来监听数据、根据推送数据过来的接口做一些数据处理。

  • 搭配其他接口协作, 依赖于Spring生命周期, 针对某个时间节点、合适的条件判断,来生成自己需要的对象。

5、典型应用

  • MyBatis3 提供 mybatis-spring项目中的 org.mybatis.spring.SqlSessionFactoryBean:

  • 阿里开源的分布式服务框架 Dubbo 中的Consumer 也使用到了FactoryBean

  • shiro中ShiroFilterFactoryBean

  • druid的JdbcStatManagerFactoryBean

IT技术分享社区

个人博客网站:https://programmerblog.xyz

文章推荐程序员效率:画流程图常用的工具程序员效率:整理常用的在线笔记软件远程办公:常用的远程协助软件,你都知道吗?51单片机程序下载、ISP及串口基础知识硬件:断路器、接触器、继电器基础知识

Spring系列(七):@FactoryBean注解用法介绍相关推荐

  1. Spring系列(十一):@Profile 注解用法介绍

    今天给大家分享Spring属性注入的注解@Profile 介绍,希望对大家能有所帮助! 一.@Profile 注解的作用 在Spring容器中如果存在同一类型的多个组件,可以使用@Profile注解标 ...

  2. Spring系列(十):@Autowired 和@Resource注解用法介绍

    今天给大家分享Spring属性注入的注解@Autowired 和@Resource介,希望对大家能有所帮助! 一.@Autowired 注解 1.1 介绍 @Autowired注解默认按照类型容器中找 ...

  3. Spring系列(六):@Conditional注解用法介绍

    今天给大家介绍@Conditional懒加载注解用法,希望对大家能有所帮助! 1.@Conditional注解介绍 @Conditional是Spring4版本新提供的一种注解,它的作用是按照设定的条 ...

  4. Spring系列(五):@Lazy懒加载注解用法介绍

    今天给大家介绍@Lazy懒加载注解用法,希望对大家能有所帮助! 1.@Lazy 懒加载注解的概念 SpringIoC容器会在启动的时候实例化所有单实例 bean .如果我们想要实现 Spring 在启 ...

  5. Spring系列(二):Bean注解用法介绍

    今天给大家介绍一下Spring中Bean注解的用法,后续的文章给大家介绍Sping其他注解用法,希望对大家日常工作能有所帮助! 1.首先创建一个maven项目引入spring依赖 <depend ...

  6. Spring系列(四):@Scope注解用法介绍

    今天给大家分享Spring中@Scope注解的用法,希望对大家能有所帮助! @Scope 定义以及作用 @Scope注解主要作用是调节Ioc容器中的作用域,在Spring IoC容器中主要有以下五种作 ...

  7. Spring系列(三):@ComponentScan注解用法介绍

    今天给大家分享Spring中@ComponentScan注解的用法,希望对大家能有所帮助! 1.@ComponentScan注解的作用 @ComponentScan注解一般和@Configuratio ...

  8. Spring系列之FactoryBean(一)

    在我们的开发工作中应该都见过或使用过FactoryBean这个类,也许你会看成了BeanFactory这个类.FactoryBean和BeanFactory虽然长的很像,但是他们的作用确实完全不像.这 ...

  9. 手撸Spring系列2:IOC/DI 思想(源码篇-IOC)

    说在前头: 笔者本人为大三在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,发布的文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正. ...

最新文章

  1. 公路图和地铁图有什么区别?
  2. chrome浏览器极简插件大全
  3. 三、【线性表】线性表概述
  4. matlab中如何调用gpu进行并行计算_极致安卓-Termux/Aid learning开启WebGL手机GPU并行计算...
  5. c#copyto_String.CopyTo()方法以及C#中的示例
  6. 韦小宝适合做IT人的8大理由
  7. divcss布局模板代码_CSS3布局(前端所必须要掌握)
  8. POJ-1050(DP)
  9. 杭电OJ分类题目(3)
  10. 对比Hashtable、HashMap、TreeMap有什么不同(转)
  11. redis主从、哨兵、集群的区别
  12. 【游戏】基于matlab中国象棋【含Matlab源码 489期】
  13. 无穷级数(四)函数的幂级数展开
  14. win10禁用驱动程序强制签名_Win10系统永久禁用驱动数字签名的方法是什么?
  15. iredmail mysql_iRedmail配置手册
  16. 我的世界服务器银行系统,我的世界多功能银行系统制作教程
  17. 图标快速定位工具 ElementUI FontAwesome iView
  18. 空气温湿度光照度传感器
  19. c语言圆角矩形实现,MFC怎么绘制一个圆角矩形
  20. 最大类间方差法(大津法OTSU)原理

热门文章

  1. 将对象集合包装成JSON格式
  2. Ext.form.field.ComboBox组合框
  3. 【数据库学习】——windows、MySQL构建新闻管理系统(控制台版)
  4. 【深度学习】mask_rcnn训练自己的数据集以及模型使用(实践结合GitHub项目)
  5. 【pyqt5】——信号与槽
  6. SOLIDWORKS——参数化建模
  7. 在windows上安装OpenCV
  8. linux虚拟主机泛解析,Apache虚拟主机的配置和泛域名解析实现代码
  9. docker启动nginx后挂了_Docker容器部署 Nginx服务
  10. 为什么需要做归一化或者标准化