首页 > 编程语言 >Spring源码-createBeanInstance方法Supplier创建bean实例

Spring源码-createBeanInstance方法Supplier创建bean实例

时间:2022-09-30 14:57:40浏览次数:56  
标签:return name Spring instanceSupplier bean 源码 Supplier public append

一、例子

Supplier.java

@FunctionalInterface
public interface Supplier<T> {

    /**
     * Gets a result.
     *
     * @return a result
     */
    T get();
}

java8以后提供的接口,可以看作是生产者,返回一个对象。

User.java

public class User {
private Integer id;

private String name;


private Integer age;

public Integer getId() {
	return id;
}

public void setId(Integer id) {
	this.id = id;
}

public String getName() {
	return name;
}

public void setName(String name) {
	this.name = name;
}

public Integer getAge() {
	return age;
}

public void setAge(Integer age) {
	this.age = age;
}

@Override
public String toString() {
	final StringBuffer sb = new StringBuffer("User{");
	sb.append("id=").append(id);
	sb.append(", name='").append(name).append('\'');
	sb.append(", age=").append(age);
	sb.append('}');
	return sb.toString();
}
}

SupplierBeanFactoryPostProcessor.java

public class SupplierBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
	AbstractBeanDefinition user = (AbstractBeanDefinition)beanFactory.getBeanDefinition("user");
	user.setInstanceSupplier(()->{
		User user1 = new User();
		return user1;
	});
}
}

supplier.xml

<?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 id="user" class="supplier.User">
		<property name="id" value="1"/>
		<property name="name" value="测试"/>
		<property name="age" value="20"/>
 	</bean>

	<bean class="supplier.SupplierBeanFactoryPostProcessor"/>
</beans>

Test.java

public class Test {
public static void main(String[] args) {
	ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("supplier.xml");

	User user = applicationContext.getBean(User.class);
	System.out.println(user);
}
}

二Spring源码解读Supplier创建bean实例

AbstractAutowireCapableBeanFactory的createBeanInstance:

  Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
	if (instanceSupplier != null) {
		return obtainFromSupplier(instanceSupplier, beanName);
	}

protected BeanWrapper obtainFromSupplier(Supplier<?> instanceSupplier, String beanName) {
	Object instance;

	String outerBean = this.currentlyCreatedBean.get();
	this.currentlyCreatedBean.set(beanName);
	try {
		instance = instanceSupplier.get();
	}
	finally {
		if (outerBean != null) {
			this.currentlyCreatedBean.set(outerBean);
		}
		else {
			this.currentlyCreatedBean.remove();
		}
	}

	if (instance == null) {
		instance = new NullBean();
	}
	BeanWrapper bw = new BeanWrapperImpl(instance);
	initBeanWrapper(bw);
	return bw;
}

如果AbstractBeanDefinition的instanceSupplier不为null,则调用instanceSupplier创建bean实例。

标签:return,name,Spring,instanceSupplier,bean,源码,Supplier,public,append
From: https://www.cnblogs.com/shigongp/p/16744867.html

相关文章

  • Bean
    1.Bean的作用域在Spring中可以通过配置bean标签的scope属性来指定bean的作用域范围<beanid="user"class="com.bean.User"scope="prototype"></bean>singleton:每次......
  • 使用阿里云 SpringBoot 仓库初始化项目
    本文基于:https://www.bilibili.com/video/BV15b4y1a7yG?p=5&vd_source=cf8900ba33d057d422c588abe5d5290d使用IDEA新建项目选择SpringInitizlizr选择web工......
  • Springboot 之 HandlerMethodArgumentResolver 运用
    介绍在项目中,如果需要在Header中获取请求头,一般使用RequestHeader注解。代码案例如下:@RequestMapping("/normalHeaders") publicMap<String,Object>normalHeader......
  • Springboot 之 JDBC 多数据源实现
    简介Springboot中使用JdbcTemplate实现多数据源比较简单。查看JdbcTemplate源码;可以发现JdbcTemplate提供了传入DataSource的方式构建不同的JdbcTemplate实例......
  • 学习笔记:springBoot整合七牛云
    在项目开发的过程中,文件存储是一大问题,本人遇到的情况是服务器的操作系统从原来的Linux变成了windowServer,但是,自己写的文件上传具有SFTP功能,服务器对于一些路径出现了乱......
  • 常用注解:Java、Spring框架
    Java8SpringFramework/Boot/Web-- Java中的注解【很神奇】。ben发布于博客园虽然用过很多,但是,对其感知仍然模糊,应该是对它们的使用原理不清楚所致。本文仅整理一......
  • SpringBoot集成Dubbo案例
    SpringBoot集成Dubbo:Case​​1、什么是Duubo?​​​​2、概念架构​​​​2.1提供者​​​​2.2消费者​​​​2.3注册中心​​​​3、SpringBoot集成Dubbo步骤​​​​:o......
  • SpringCloud 【Gateway-API网关】
    GateWay-API网关​​SpringCloudAlibaba风格组件​​文章目录​​GateWay-API网关​​​​前言​​​​什么是API网关​​​​网关的组成​​​​路由转发​​​​过滤......
  • SpringCloud【OpenFeign】-服务间调用的利器
    文章目录​​前言​​​​一、OpenFeign快速使用​​​​1.1SpringCloudAlibaba快速整合OpenFeign​​​​二、声明式服务调用​​​​三、编程式服务调用:fire::fire:​......
  • SpringBoot文件上传深入浅出
    前言文件上传原理浏览器发起HTTPPOST请求,指定请求头:Content-Type:multipart/form-dataContent-Type:指定了文件类型服务端解析请求内容,执行文件保存处理,返回成功消息。不......