【spring源码】基于factoryMethod创建bean对象
案例:
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对象相关推荐
- Spring源码分析-如何获取Bean对象
导语 在上篇博客中 介绍了关于BeanFactory和FactoryBean相关的操作,并且查看了在两个操作中他们具体的代码有那些,这篇博客主要就是顺着上篇博客思路继续来分析Bean对象的获取.下 ...
- Spring AOP源码(2)—AspectJAwareAdvisorAutoProxyCreator创建代理对象【两万字】
基于最新Spring 5.x,介绍了Spring AOP中的AspectJAwareAdvisorAutoProxyCreator自动代理创建者的工作流程,对于创建代理对象的源码进行了深度分析! ...
- 【Spring源码三千问】Bean的Scope有哪些?scope=request是什么原理?
Bean的Scope有哪些?scope=request是什么原理? 前言 版本约定 正文 Scope 接口的类图 RequestScope 在哪里注册的? Scope 在哪里生效的? scope=re ...
- spring源码深度解析---创建AOP代理之获取增强器
spring源码深度解析-创建AOP代理之获取增强器 在上一篇的博文中我们讲解了通过自定义配置完成了对AnnotationAwareAspectJAutoProxyCreator类型的自动注册,那么这 ...
- 【spring源码】二、bean定义、工厂
文章目录 一.基础概念 4.BeanFactory 和 ApplicationContext 5.FactoryBean 二.bean定义 "bean定义"是什么? 三.bean工 ...
- 【框架源码】Spring源码底层IOC容器加入对象的方式
1.Spring容器加入对象方式简介 使用XML配置文件 在XML配置文件中使用< bean >标签来定义Bean,通过ClassPathXmlApplicationContext等容器来 ...
- 【Spring源码分析系列】bean的加载
前言 以 BeanFactory bf = new XmlBeanFactory(new ClassPathResource("beans.xml"));为例查看bean的加载过 ...
- 单元测试源码分析之一创建mock对象
之前已经介绍过Mockito和PowerMock的常见用法,PowerMock其实就是在Mockito的基础上使用了字节码技术使得其可以对静态方法,私有方法等进行插桩. 现在就先来看看Mockito是 ...
- spring源码阅读(1/4) - Bean生成
上午去缴了上次没带驾驶证的扣分罚款,最近在图书馆没事就看曾国藩家书,曾国藩说人要明强.光强没有用,你要明强.也就是说要强的有道理.曾国藩又说,做学问不能做死学问,做学问其实很重要的事就是能懂得孝悌,把 ...
最新文章
- OpenC 仿射变换
- gui的design 无界面_无蓝光不刺眼 海信阅读手机超长续航双11嗨不停_
- python要不要装pycharm-Python和pyCharm安装
- Mysql Engine【innodb,myisam】
- setitimer 创建两个定时器_UE4 Timer(定时器)相关源码分析
- 前端学习(2339):React出现的历史背景
- Java 画精美图形
- 深度学习(图像处理)代码库
- JS面向对象之创建对象
- 如何对大数据进行数据分析
- 在Ubuntu上为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序
- spring配置jackson不返回null值
- Alfred效率神器
- 大数据概览以及当下实用的主流开发
- Codeforces1153——D. Serval and Rooted Tree(思维好题+dfs+贪心)
- 虚拟运营商出牌:流量不清零难成杀手锏
- 优秀码农选择对象详细指南,看完记得要实战噢
- 【整理】输入导航功能-查询与拼音首字母的结合以提高用户体验
- python数据分析就业班_云开见明 2020Python数据分析师特训营全套课程84节
- HNUST - 数据库课设
热门文章
- 电子信息、通信、电类专业将会遇到的面试题大全!精!!!看了让人大吃一惊......
- 乔丹的七个经典回忆 回味飞人从人到神的完全历程
- 关于coursera上Learning How to Learn课程的读书笔记2
- 汇编指令的英文全称(中英文对照)
- 针对BraTS2018~2020的项目经验总结
- C语言中的内聚与耦合(遵循“一个函数,一个功能”的原则)
- 好用的标图工具LabelImage
- JavaScript 生成器Generator
- bugku 成绩单 总结
- 通过TCP协议实现通信