1.前提概要

很多java开发者在使用Spring框架中都见过后缀为FactoryBean的类,比如Mybatis-Spring中的SqlSessionFactoryBean。说到这里就不得不提BeanFactory。FactoryBean和BeanFactory特别容易让人混淆,面试还经常问到这两种概念。其实它们的作用和使用场景是不一样的。

2.BeanFactory

先来说说BeanFactory。用于访问Spring bean容器的根接口。这是Spring bean容器的基本客户端视图。原来是获取Spring Bean的接口,也就是IoC容器。然后我们看类图。

原来我们更常用的ApplicationContext就是一个BeanFactory。我们通过bean的名称或者类型都可以从BeanFactory来获取bean。对于BeanFactory这么介绍相信都不陌生了。让我们把关注点转向FactoryBean上。

3.FactoryBean

FactoryBean 是个什么玩意儿呢?来看看源码。

  • T getObject() 获取泛型T的实例。用来创建Bean。当IoC容器通过getBean方法来FactoryBean创建的实例时实际获取的不是FactoryBean 本身而是具体创建的T泛型实例。等下我们会来验证这个事情。
  • Class> getObjectType() 获取 T getObject()中的返回值 T 的具体类型。这里强烈建议如果T是一个接口,返回其具体实现类的类型。
  • default boolean isSingleton() 用来规定 Factory创建的的bean是否是单例。这里通过默认方法定义为单例。

3.1 FactoryBean使用场景

FactoryBean 用来创建一类bean。比如你有一些同属鸟类的bean需要被创建,但是它们自己有各自的特点,你只需要把他们的特点注入FactoryBean中就可以生产出各种鸟类的实例。举一个更加贴近实际生产的例子。甚至这个例子你可以应用到实际java开发中去。我们需要自己造一个定时任务的轮子。用FactoryBean 再合适不过了。我们来用代码说话一步步来演示FactoryBean的使用场景。

3.2 构建一个FactoryBean

我们声明定时任务一般具有下列要素:

  • 时间周期,肯定会使用到cron表达式。
  • 一个任务的执行抽象接口。
  • 定时任务具体行为的执行者。

Task任务执行抽象接口的实现。实现包含两个方面:

  • SomeService 是具体任务的执行逻辑。
  • cron时间表达式

通过以上的定义。任务的时间和任务的逻辑可以根据不同的业务做到差异化配置。然后我们实现一个关于Task的FactoryBean。

3.3 FactoryBean 注入IoC

你可以使用xml的注入方式,当然也可以使用javaConfig的配置方式。这里我们使用javaConfig注入。我们将两个FactroyBean注入到Spring容器中去。

3.4 FactoryBean的一些特点

一般如上声明后,@Bean注解如果不显式声明bean名称则方法名作为bean的名称,而且返回值作为注入的Bean。但是我们通过debug发现却是这样的:

也就是说通过方法名是返回FactoryBean 创建的Bean。那么如何返回该FactoryBean呢?上图中也给出了答案在方法前增加引用符“&”。具体的原因还用从BeanFactory中寻找,真是不是冤家不聚头。

我们对上面声明的两个bean进行测试,也出色地完成了不同的定时任务业务逻辑。

4.总结

在后续的使用中你可以通过声明不同的cron表达式,以及不同SomeService来定制更多的定时任务。通过这个例子相信你会对FactoryBean有的清晰的认识。demo就不提供了,非常简单,强烈建议你自己试一试以加深理解。

作者:码农小胖哥

factorybean 代理类不能按照类型注入_快速理解Spring中的FactoryBean接口相关推荐

  1. factorybean 代理类不能按照类型注入_《Spring入门经典》:使用Spring进行依赖注入

    第二章:使用Spring进行依赖注入 重点:配置并使用Spring容器 使用不同类型的配置元数据来配置Spring容器 理解依赖解析 了解自动装配的优缺点 在容器中执行显式Bean查找 学习不同的Be ...

  2. factorybean 代理类不能按照类型注入_彻底搞懂依赖注入(一)Bean实例创建过程

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 上一章介绍了Bean的加载过程(IOC初始化过程),加载完成后,紧接着就要用到它的依赖注入 ...

  3. factorybean 代理类不能按照类型注入_Spring拓展接口之FactoryBean,我们来看看其源码实现...

    是什么 FactoryBean的源码比较简单,大家可以细读下其注释,我做了简单的如下翻译 /*** 实现此接口的bean不能用作普通bean.此bean暴露的对象是通过getObject()创建的对象 ...

  4. factorybean 代理类不能按照类型注入_Spring注解驱动开发之四——@Import快速导入组件、FactoryBean 定义工厂注册组件...

    本文包含以下内容: @Import快速导入组件 配合ImportSelector 导入组件 配合ImportBeanDefinitionRegistrar 导入组件 FactoryBean 定义工厂注 ...

  5. java的lookup方法_深入理解Spring中的Lookup(方法注入)

    前言 本文主要给大家介绍了关于Spring中Lookup(方法注入)的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 在使用Spring时,可能会遇到这种情况:一个单例的Be ...

  6. python ioc框架_轻松理解 Spring 中的 IOC

    Spring 简介 Spring 是一个开源的轻量级的企业级框架,其核心是反转控制 (IoC) 和面向切面 (AOP) 的容器框架.我们可以把 Spring 看成是对象的容器,容器中可以包含很多对象, ...

  7. java单例模式理解_快速理解Java中的五种单例模式

    解法一:只适合单线程环境(不好) packagetest;/***@authorxiaoping **/ public classSingleton {private static Singleton ...

  8. 不同类的方法 事务问题_深入理解 Spring 事务原理

    Spring事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的.对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: 获 ...

  9. python如何初始化对象数组_如何理解Python中的面向对象编程?

    (由Python大本营付费下载自视觉中国) 作者 | Radek Fabisiak 译者 | 弯月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews) 现如今面向对象编程的使用非常广泛,本文 ...

最新文章

  1. Spring5:@Autowired注解、@Resource注解和@Service注解
  2. 初入angular4——实际项目搭建总结
  3. html:(31):层叠和重要性
  4. 通讯录数据表设计v0.5
  5. Netty : 臭名昭著的JDK的NIO bug(空轮询bug)
  6. python编程入门指南-Python入门学习指南
  7. HibernateEHCache –Hibernate二级缓存
  8. 新基建安全怎么做?看看这场院士领衔的高峰对话
  9. zencart如何更换模版
  10. css信号强度显示,纯css实现wifi信号图标及强弱/链接/加密状态
  11. 十本Android开发学习书籍下载链接
  12. 微信小程序 Springboot校运会高校运动会管理系统
  13. html5外链式引入不了字体,css中导入外部字体不生效的原因是什么?
  14. 清平调-邓丽君歌曲(非王菲或混合)简介及下载
  15. 微信转盘抽奖前端源码(三):移动端浏览器兼容性(12个奖品,指针开始时指向奖品)
  16. KEIL MDK5.37版本自行添加AC5(ARMCC)编译器
  17. golang中channel使用
  18. JDBC和数据库事务详解
  19. Ecahrts图例后添加百分比和数据
  20. 我的官方网站正式上线!欢迎访问!

热门文章

  1. 无法从elasticsearch节点检索版本信息_【Elasticsearch 7 搜索之路】(一)什么是 Elasticsearch?...
  2. 聊聊零基础的我是如何学python的_零基础学python-4.3 对象的比较
  3. mysql 添加删除权限_MySQL实例讲解:添加账户、授予权限、删除用户
  4. linux重启docker镜像都没了,linux – 没有响应的Docker命令挂起
  5. linux查看系统后台,求助,如何查看后台服务
  6. Linux中Docker部署Redis
  7. android手机如何提速,安卓手机上网如何提速
  8. ES启动错误 ERROR: the system property [es.path.conf] must be set
  9. FeignClient与RestTemplate的区别
  10. Win10关闭windows defender杀毒软件的方法