Spring系列(七):@FactoryBean注解用法介绍
今天给大家介绍@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注解用法介绍相关推荐
- Spring系列(十一):@Profile 注解用法介绍
今天给大家分享Spring属性注入的注解@Profile 介绍,希望对大家能有所帮助! 一.@Profile 注解的作用 在Spring容器中如果存在同一类型的多个组件,可以使用@Profile注解标 ...
- Spring系列(十):@Autowired 和@Resource注解用法介绍
今天给大家分享Spring属性注入的注解@Autowired 和@Resource介,希望对大家能有所帮助! 一.@Autowired 注解 1.1 介绍 @Autowired注解默认按照类型容器中找 ...
- Spring系列(六):@Conditional注解用法介绍
今天给大家介绍@Conditional懒加载注解用法,希望对大家能有所帮助! 1.@Conditional注解介绍 @Conditional是Spring4版本新提供的一种注解,它的作用是按照设定的条 ...
- Spring系列(五):@Lazy懒加载注解用法介绍
今天给大家介绍@Lazy懒加载注解用法,希望对大家能有所帮助! 1.@Lazy 懒加载注解的概念 SpringIoC容器会在启动的时候实例化所有单实例 bean .如果我们想要实现 Spring 在启 ...
- Spring系列(二):Bean注解用法介绍
今天给大家介绍一下Spring中Bean注解的用法,后续的文章给大家介绍Sping其他注解用法,希望对大家日常工作能有所帮助! 1.首先创建一个maven项目引入spring依赖 <depend ...
- Spring系列(四):@Scope注解用法介绍
今天给大家分享Spring中@Scope注解的用法,希望对大家能有所帮助! @Scope 定义以及作用 @Scope注解主要作用是调节Ioc容器中的作用域,在Spring IoC容器中主要有以下五种作 ...
- Spring系列(三):@ComponentScan注解用法介绍
今天给大家分享Spring中@ComponentScan注解的用法,希望对大家能有所帮助! 1.@ComponentScan注解的作用 @ComponentScan注解一般和@Configuratio ...
- Spring系列之FactoryBean(一)
在我们的开发工作中应该都见过或使用过FactoryBean这个类,也许你会看成了BeanFactory这个类.FactoryBean和BeanFactory虽然长的很像,但是他们的作用确实完全不像.这 ...
- 手撸Spring系列2:IOC/DI 思想(源码篇-IOC)
说在前头: 笔者本人为大三在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,发布的文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正. ...
最新文章
- 公路图和地铁图有什么区别?
- chrome浏览器极简插件大全
- 三、【线性表】线性表概述
- matlab中如何调用gpu进行并行计算_极致安卓-Termux/Aid learning开启WebGL手机GPU并行计算...
- c#copyto_String.CopyTo()方法以及C#中的示例
- 韦小宝适合做IT人的8大理由
- divcss布局模板代码_CSS3布局(前端所必须要掌握)
- POJ-1050(DP)
- 杭电OJ分类题目(3)
- 对比Hashtable、HashMap、TreeMap有什么不同(转)
- redis主从、哨兵、集群的区别
- 【游戏】基于matlab中国象棋【含Matlab源码 489期】
- 无穷级数(四)函数的幂级数展开
- win10禁用驱动程序强制签名_Win10系统永久禁用驱动数字签名的方法是什么?
- iredmail mysql_iRedmail配置手册
- 我的世界服务器银行系统,我的世界多功能银行系统制作教程
- 图标快速定位工具 ElementUI FontAwesome iView
- 空气温湿度光照度传感器
- c语言圆角矩形实现,MFC怎么绘制一个圆角矩形
- 最大类间方差法(大津法OTSU)原理
热门文章
- 将对象集合包装成JSON格式
- Ext.form.field.ComboBox组合框
- 【数据库学习】——windows、MySQL构建新闻管理系统(控制台版)
- 【深度学习】mask_rcnn训练自己的数据集以及模型使用(实践结合GitHub项目)
- 【pyqt5】——信号与槽
- SOLIDWORKS——参数化建模
- 在windows上安装OpenCV
- linux虚拟主机泛解析,Apache虚拟主机的配置和泛域名解析实现代码
- docker启动nginx后挂了_Docker容器部署 Nginx服务
- 为什么需要做归一化或者标准化