案例:

1.定义Student类:

@Data
public class Student {private String name;private Integer age;public Student() {}public Student(String name) {this.name = name;}public Student(String name, Integer age) {this.name = name;this.age = age;}}

2.定义静态工厂方法/工厂实例方法:

public class StudentStaticFactory {public static Student getStudent(String name) {return new Student("悟饭");}public static Student getStudent(String name, int age) {return new Student("悟饭", 22);}
}

工厂实例方法

public class StudentInstanceFactory {public Student getStudent(String name) {Student student = new Student(name);return student;}
}

3.定义bean信息;分别定义使用静态工厂方法和实例工厂方法生成bean对象:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--定义bean对象; 指定静态工厂方法--><bean id ="studentStatic" class="com.cosmos.springdebug.factorymethod.StudentStaticFactory" factory-method="getStudent"><!--constructor-arg:可以为方法指定参数--><constructor-arg value="悟饭"></constructor-arg><constructor-arg value="25"></constructor-arg></bean><!--定义bean对象--><bean id="studentInstanceFactory" class="com.cosmos.springdebug.factorymethod.StudentInstanceFactory"></bean><!--定义bean对象; 指定工厂bean和实例工厂方法--><bean id="student" class="com.cosmos.springdebug.Student" factory-bean="studentInstanceFactory" factory-method="getStudent"><constructor-arg value="悟天"></constructor-arg></bean>
</beans>

4.测试:

public class TestFactoryMethod {public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("factoryMethod.xml");// 获取静态工厂方法中生成的bean对象Student stu = context.getBean("studentStatic", Student.class);System.out.println(stu);// 获取实例工厂方法生成bean对象Student student = context.getBean("student", Student.class);System.out.println(student);}
}/**
* ==========result=============
* Student(name=悟饭, age=22)
* Student(name=悟天, age=null)
*/

factoryMethod创建bean对象底层源码逻辑:

真正执行bean创建方法doCreateBean;所以这里主要梳理doCreateBean中执行工厂实例方法和工厂静态方法创建bean对象流程:

使用factoryMethod创建bean底层流程图:

instantiateUsingFactoryMethod底层实现逻辑:

instantiateUsingFactoryMethod方法实现流程图:

总结:
通过BeanDefinition属性factoryMethod创建bean对象是spring创建对象的5种方式之一;这种方式更为灵活,可以自行定义bean对象的生成方法;不局限于需要实现指定的接口和方法!关于BeanWrapperImpl包装对象设置了相关的类型转换服务;类型转换是创建bean对象封装到包装对象的重要作用!

【spring源码】基于factoryMethod创建bean对象相关推荐

  1. Spring源码分析-如何获取Bean对象

    导语   在上篇博客中 介绍了关于BeanFactory和FactoryBean相关的操作,并且查看了在两个操作中他们具体的代码有那些,这篇博客主要就是顺着上篇博客思路继续来分析Bean对象的获取.下 ...

  2. Spring AOP源码(2)—AspectJAwareAdvisorAutoProxyCreator创建代理对象【两万字】

      基于最新Spring 5.x,介绍了Spring AOP中的AspectJAwareAdvisorAutoProxyCreator自动代理创建者的工作流程,对于创建代理对象的源码进行了深度分析! ...

  3. 【Spring源码三千问】Bean的Scope有哪些?scope=request是什么原理?

    Bean的Scope有哪些?scope=request是什么原理? 前言 版本约定 正文 Scope 接口的类图 RequestScope 在哪里注册的? Scope 在哪里生效的? scope=re ...

  4. spring源码深度解析---创建AOP代理之获取增强器

    spring源码深度解析-创建AOP代理之获取增强器 在上一篇的博文中我们讲解了通过自定义配置完成了对AnnotationAwareAspectJAutoProxyCreator类型的自动注册,那么这 ...

  5. 【spring源码】二、bean定义、工厂

    文章目录 一.基础概念 4.BeanFactory 和 ApplicationContext 5.FactoryBean 二.bean定义 "bean定义"是什么? 三.bean工 ...

  6. 【框架源码】Spring源码底层IOC容器加入对象的方式

    1.Spring容器加入对象方式简介 使用XML配置文件 在XML配置文件中使用< bean >标签来定义Bean,通过ClassPathXmlApplicationContext等容器来 ...

  7. 【Spring源码分析系列】bean的加载

    前言 以 BeanFactory bf  = new XmlBeanFactory(new ClassPathResource("beans.xml"));为例查看bean的加载过 ...

  8. 单元测试源码分析之一创建mock对象

    之前已经介绍过Mockito和PowerMock的常见用法,PowerMock其实就是在Mockito的基础上使用了字节码技术使得其可以对静态方法,私有方法等进行插桩. 现在就先来看看Mockito是 ...

  9. spring源码阅读(1/4) - Bean生成

    上午去缴了上次没带驾驶证的扣分罚款,最近在图书馆没事就看曾国藩家书,曾国藩说人要明强.光强没有用,你要明强.也就是说要强的有道理.曾国藩又说,做学问不能做死学问,做学问其实很重要的事就是能懂得孝悌,把 ...

最新文章

  1. OpenC 仿射变换
  2. gui的design 无界面_无蓝光不刺眼 海信阅读手机超长续航双11嗨不停_
  3. python要不要装pycharm-Python和pyCharm安装
  4. Mysql Engine【innodb,myisam】
  5. setitimer 创建两个定时器_UE4 Timer(定时器)相关源码分析
  6. 前端学习(2339):React出现的历史背景
  7. Java 画精美图形
  8. 深度学习(图像处理)代码库
  9. JS面向对象之创建对象
  10. 如何对大数据进行数据分析
  11. 在Ubuntu上为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序
  12. spring配置jackson不返回null值
  13. Alfred效率神器
  14. 大数据概览以及当下实用的主流开发
  15. Codeforces1153——D. Serval and Rooted Tree(思维好题+dfs+贪心)
  16. 虚拟运营商出牌:流量不清零难成杀手锏
  17. 优秀码农选择对象详细指南,看完记得要实战噢
  18. 【整理】输入导航功能-查询与拼音首字母的结合以提高用户体验
  19. python数据分析就业班_云开见明 2020Python数据分析师特训营全套课程84节
  20. HNUST - 数据库课设

热门文章

  1. 电子信息、通信、电类专业将会遇到的面试题大全!精!!!看了让人大吃一惊......
  2. 乔丹的七个经典回忆 回味飞人从人到神的完全历程
  3. 关于coursera上Learning How to Learn课程的读书笔记2
  4. 汇编指令的英文全称(中英文对照)
  5. 针对BraTS2018~2020的项目经验总结
  6. C语言中的内聚与耦合(遵循“一个函数,一个功能”的原则)
  7. 好用的标图工具LabelImage
  8. JavaScript 生成器Generator
  9. bugku 成绩单 总结
  10. 通过TCP协议实现通信