new一个类的时候,有下面几种方式

xml静态工厂

public class A {public A(){System.out.println("default Constructor");}public A(String s){System.out.println("Constructor String static factory method");}public A(int i){System.out.println("Constructor int static factory method");}public A(float f){System.out.println("Constructor float supplier");}
}@Component
@ImportResource("classpath:spring.xml")
public class Config {}@Testpublic void staticsModel(){AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();context.register(Config.class);context.refresh();}//打印结果
Constructor String static factory method

xml工厂

与上面的方法没有本质的区别,就是把原本的静态方法调用改为了普通方法,所以需要先声明一下objectStaticFactory对象

<bean id="a" class="com.spring.statics.A" factory-bean="objectStaticFactory" factory-method="instanceObject"></bean><bean id="objectStaticFactory" class="com.spring.statics.ObjectFactory" ></bean>

beanDefinition工厂

与xml的工厂差不多,只不过这个方法是把工厂类都交给了beanDefinition,不需要spring再去扫描,而是直接生成beanDefinition这种Bean的基础类。

@Testpublic void staticsModel(){AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();context.register(ObjectFactory.class);GenericBeanDefinition beanDefinition = new GenericBeanDefinition();beanDefinition.setBeanClass(A.class);beanDefinition.setFactoryBeanName("objectFactory");beanDefinition.setFactoryMethodName("instanceObject");context.registerBeanDefinition("a", beanDefinition);context.refresh();}

supplier方法

这种方法与上面的本质区别在于
上面都是通过BeanName或者Type进行反射从容器中获取到Bean,然后进行实例化
而supplier不需要通过反射,而是在supplierFactory中直接实例化对象,所以supplier的效率比其他方式要高。

public class SupplierFactory {public Object instanceObject(){return new A(2.0f);}@Lookuppublic static Object getObject(){return new A(2.0f);}
}   @Testpublic void staticsModel(){AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();context.register(ObjectFactory.class);GenericBeanDefinition beanDefinition = new GenericBeanDefinition();beanDefinition.setBeanClass(A.class);SupplierFactory supplierFactory = new SupplierFactory();beanDefinition.setInstanceSupplier(supplierFactory::instanceObject);context.registerBeanDefinition("a", beanDefinition);context.refresh();}

supplier静态方法

@Testpublic void staticsModel(){AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();context.register(ObjectFactory.class);GenericBeanDefinition beanDefinition = new GenericBeanDefinition();beanDefinition.setBeanClass(A.class);beanDefinition.setInstanceSupplier(SupplierFactory::getObject);context.registerBeanDefinition("a", beanDefinition);context.refresh();}

spring源码之supplier方法相关推荐

  1. spring 源码_spring源码系列(一)——spring循环引用

    众所周知spring在默认单例的情况下是支持循环引用的 为了节省图片大小我把那些可以动得gif图片做成了只循环一次,如果看到图片不动了请右键选择在新标签打开,那么图片就会动,手机用户则更简单,直接手指 ...

  2. 我该如何学习spring源码以及解析bean定义的注册

    如何学习spring源码 前言 本文属于spring源码解析的系列文章之一,文章主要是介绍如何学习spring的源码,希望能够最大限度的帮助到有需要的人.文章总体难度不大,但比较繁重,学习时一定要耐住 ...

  3. Spring源码剖析 循环注入

    版权声明:本文为CSDN博主「shadow?s」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/java_ly ...

  4. Spring源码分析系列——bean创建过程分析(三)——工厂方法创建bean

    前言 spring创建bean的方式 测试代码准备 createBeanInstance()方法分析 instantiateUsingFactoryMethod()方法分析 总结 spring创建be ...

  5. 一、如何阅读Spring源码(全网最简单的方法)

    学习Java最好最有效的方法是学习Spring,但是最笨最没效的方法也是学习Spring. 为什么这么说呢?道理其实很简单 A.Spring很庞大,很完善,也非常的底层,如果我们学会的Spring,那 ...

  6. spring源码依赖注入的核心方法populateBean(beanName, mbd, instanceWrapper)分析

    spring源码依赖注入的核心方法populateBean(beanName, mbd, instanceWrapper)分析:通过源码我们发现在分析这个方法之前,此对象已经创建完成实例,内存开辟了空 ...

  7. Spring源码之getBean(获取 bean)方法(二)解读

    目录 前言 `spring` 初始化 `bean` 过程 进入类 `ClassPathXmlApplicationContext` 的构造器 `AbstractApplicationContext` ...

  8. Spring源码讲解之 getBean 方法

    getBean 方法是用来进行获取 bean 实例对象的,是我们进行 spring 程序开发从 bean 工厂获取结果的.那这个方法的执行过程是什么样的,下面我们就去揭开它的面纱. 样例代码 Appl ...

  9. 【spring源码系列-05】refresh中prepareRefresh方法的执行流程

    Spring源码系列整体栏目 内容 链接地址 [一]spring源码整体概述 https://blog.csdn.net/zhenghuishengq/article/details/13094088 ...

最新文章

  1. 智能车竞赛技术报告 | 智能车视觉 - 中国矿业大学 - 会飞的车
  2. 皮一皮:中国好男友?
  3. python发展前景怎么样-python发展前景怎么样
  4. oracle按时间导出,如何为Oracle导出文件加上时间戳
  5. android 内存播放视频播放器,视频流媒体播放器EasyPlayer-RTSP安卓版在RK3399上运行APP崩溃问题...
  6. 数据分析与挖掘实战-基于基站定位数据的商圈分析
  7. ubuntu自定义安装里怎么选_中央空调到底应该怎么选?小户型也能安装中央空调?行家说实话了...
  8. UI设计素材|图标在UI设计界面当中起到什么作用
  9. DVWA-CSRF-low级别
  10. x264源代码简单分析:滤波(Filter)部分
  11. c#IntPtr简例
  12. UE4 键盘输入浅析(一)
  13. SpringAOP基础以及四种实现方式
  14. 6.4.3 拓扑排序 番茄炒蛋工程
  15. 基于Java毕业设计校园社团管理平台演示录像2021源码+系统+mysql+lw文档+部署软件
  16. java关注微信公众号登录
  17. UDS汽车诊断入门01 - 简介
  18. 解决:Godaddy域名解析很慢,网站经常打不开或者解析失败
  19. 离散题目13(判断自反关系)
  20. C/C++图书信息管理系统水电管理信息系统

热门文章

  1. 20050523:内容管理 通宵
  2. 机器学习算法------3.3 案例:癌症分类预测-良/恶性乳腺癌肿瘤预测
  3. 【批处理DOS-CMD命令-汇总和小结】-cmd的内部命令和外部命令怎么区分,CMD命令和运行(win+r)命令的区别,cmd的命令扩展(扩展命令)
  4. IMS系统简介及增值业务能力分析
  5. 家庭分享会 | 第一期:如何组织分享会
  6. java计算机毕业设计学习资源下载管理源码+mysql数据库+lw文档+系统+调试部署
  7. 5-10 列车调度 (25分)
  8. 信号与噪声:大数据时代预测的科学与艺术 - 电子书下载(高清版PDF格式+EPUB格式)...
  9. babylonjs shader
  10. IDEA 自定义代码片段/模板