Spring系列(七):@FactoryBean注解用法介绍

目录

1、@FactoryBean注解介绍

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

3、用法示例

3.1 新建Book.java

3.2 新建BookFactoryBean.java

3.3 FactoryBeanConfig.java

3.4 TestFactoryBean.java

4、@FactoryBean应用场景

5、典型应用


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

       612182ada8cf699b3f2f2b7dcda77806.png        

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/270134.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring系列(八):Spring生命周期中BeanPostProcessor接口用法介绍

目录 1、BeanPostProcessor 概念介绍 2、BeanPostProcessor接口方法 2.1 BeanPostProcessor源码内容 3、BeanPostProcessor 接口的作用 4、代码示例 4.1 新建Person.java 类文件 4.2、新建MyBeanPostProcessor.java 4.3、新建TestBeanPostProcessorConfig.java 配置类 4.4、新建…

操作系统:Windows映射网络文件夹的方法介绍

大家在工作中我们经常需要访问局域网服务器的共享文件夹&#xff0c;并将共享文件夹做网络映射&#xff0c;映射之后就相当于是访问本地磁盘一样访问远程服务器的共享文件夹。那么如何做网络映射呢&#xff1f;我们以windows操作系统为例&#xff0c;给大家分享一下网络映射的方…

运维:分享四款非常好用的命令行软件

目录 1、终端程序 — Alacritty 2、Shell – Fish 3、终端复用 — Tmux 4、编辑器 — Vim 常言道&#xff0c;工欲善其事、必先利其器&#xff0c;熟练一套高效且趁手的工具&#xff0c;对开发工作的重要性不言而喻。 本文给大家分享下命令行开发环境&#xff0c;文章较长&…

开发工具:Git和SVN有哪些差异,看完你就懂了?

目录 Git vs SVN Git核心思想 Git-SVN常用命令 初始化 配置 增删文件 分支 提交 拉取 撤销 查询 Git或SVN相信很多搞技术的工程师都用过&#xff0c;不仅仅只有程序员才进行版本管理&#xff0c;机械、硬件、测试等其他岗位也有版本管理的需求。 早期用SVN的比较多&#xff0c;…

微信PC版近期更新的几个功能,你都会用吗?

目录 1、查找和添加微信号 2、截图识别二维码或小程序码 3・识别聊天窗口二维码和小程序码 4、左侧菜单栏新增搜一搜 5、发送文件时多出一个留言输入框 6、群聊邀请确认同步至PC端 7、视频号新增添加到桌面快捷方式 8、支持电脑开机时自动启动微信 9、微信电子身份证新功能上线…

Spring系列(九):Spring属性赋值注解@Value 用法介绍

目录 1、Value注解的作用 2、Value 注解的写法 3、用法示例 3.1 resources 目录新增 book.properties 配置文件 3.2 新增实体 Book.java 3.3 新增 TestValueConfig.java 3.4 新增 TestValue.java 测试文件 4、使用场景 今天给大家分享Spring属性赋值注解Value 用法&#xff0c…

Linux:9个实用shell运维脚本

目录 1、Dos攻击防范&#xff08;自动屏蔽攻击IP&#xff09; 2、Linux系统发送告警脚本 3、MySQL数据库备份单循环 4、MySQL数据库备份多循环 5、Nginx访问访问日志按天切割 6、Nginx访问日志分析脚本 7、查看网卡实时流量脚本 8、服务器系统配置初始化脚本 9、监控100台服务器…

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

目录 一、Autowired 注解 1.1 介绍 1.2 作用 二、Resource 注解 2.1 介绍 2.2 Resource 自动注入顺序 三、Autowired 和 Resource区别 3.1 相同点&#xff1a; 3.2 不同点&#xff1a; 今天给大家分享Spring属性注入的注解Autowired 和Resource介&#xff0c;希望对大家能有所帮…

电脑软件:5个实用的Windows软件,大幅度提高你的工作效率

目录 软件一&#xff1a;投屏宝 软件二&#xff1a;Everything 软件三&#xff1a;uTools 软件四&#xff1a;Quicklook 软件五&#xff1a;CCleaner 今天小编给大家大家推荐这5款Windows必装的效率软件&#xff0c;实用又免费&#xff0c;可以大幅度提高你的工作效率。 软件一…

电脑软件:推荐八款提高工作效率的软件

目录 1、火绒杀毒软件 2、 Everything搜索神器 3、Bandizip压缩神器 ​​​​​​​4、Chrome浏览器 or 火狐 5、Snipaste 截图神器 6、geek卸载神器 7、vscode 代码编辑神器 8、Typora 今天小编给大家推荐八款提高工作效率的软件&#xff0c;欢迎下载试一试&#xff01; 1、火…

centos7 安装 python3.5

centos7 安装 python3.5 一、 python虚拟环境virtualenv VirtualEnv用于在一台机器上创建多个独立的python运行环境&#xff0c;VirtualEnvWrapper为前者提供了一些便利的命令行上的封装。 Virtualenv是一个非常好的virtual python environment builder&#xff0c;他最大的好处…

手机知识:90Hz或120Hz屏幕刷新率有啥区别

目录 1、屏幕刷新率概念介绍 2、显示器的工作原理 3、60Hz&#xff0c;90Hz和120Hz有什么区别&#xff1f; 4、高屏幕刷新率的缺点 5、你是否需要90Hz或120Hz的刷新率 今天小编给大家介绍手机90Hz或120Hz屏幕刷新率有啥区别&#xff0c;看完你就懂了&#xff01; 1、屏幕刷新率…

电脑技巧:如何更改Win10桌面文件路径,轻松给系统盘瘦身

大家平常为了方便经常会在桌面上保存各种各样的文件&#xff0c;有些桌面文件可能会比较大从而占用C盘的磁盘空间&#xff0c;而系统盘我们在分配的时候&#xff0c;一般只有60-100G左右&#xff0c;时间长了我们的系统盘就会出现磁盘容量不足的情况&#xff0c;其实我们可以将…

MAC下快速打开指定目录

1.通过快捷键搜索 command 空格&#xff0c;输入关键词 2.通过控制台打开 1) 跳转到指定路径 cd /usr 2) 当前路径下打开文件夹 open .