首页 > 其他分享 >[Spring] Spring 中bean的生命周期

[Spring] Spring 中bean的生命周期

时间:2022-12-29 22:00:34浏览次数:32  
标签:生命周期 String mbd Spring beanName bean 属性

在平时的工作中,我们的很多项目都是利用Spring进行搭建的。最近有空,基于源码好好分析一下,Bean在Spring中的生命周期

这里我们先写一个简单的小例子

<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="hello" class="com.hardy.pojo.Hello">
        <property name="str" value="Hello Spring"/>
    </bean>
</beans>
public class MyTest {
    public static void main(String[] args) {
        // 获取Spring 的上下文对象,即获取Spring容器
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        // 我们的对象都在Spring中管理。我们要使用,直接从中取出
        Hello hello = context.getBean("hello", Hello.class);
        System.out.println(hello.toString());
    }
}

这里我们使用xml文件注入的方式进行分析。自动注入和使用xml文件的方式类似。对于一般的singleton类型的bean来说,在获取到ApplicationContext的时候(ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml")),bean的初始化就已经完成了。

  1. bean的创建
    image
    这里有一个非常重要的方法org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBeanInstance,这个方法主要是来创建bean的对象。注意:此时bean的属性都还没有填充,所以bean的初始化还没有完成
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
		...
		// 通过bean Name获取Class对象
		Class<?> beanClass = resolveBeanClass(mbd, beanName);
		...
		// 通过Class获取 java.lang.reflect.Constructor. 知道反射应该知道,这个就是构造函数对象。可以通过这个构造对象了
		Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
		...
	}
  1. bean属性的注入
    image
    这里同样有一个非常重要的方法:org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean。通过函数名我们几乎就可以判断是进行属性填充的。
protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
		// 设置属性值
		applyPropertyValues(beanName, mbd, bw, pvs);
	}

protected void applyPropertyValues(String beanName, BeanDefinition mbd, BeanWrapper bw, PropertyValues pvs) {
		// 遍历属性值
		for (PropertyValue pv : original) {
			if (pv.isConverted()) {
				deepCopy.add(pv);
			}
			else {
				String propertyName = pv.getName(); // 属性名
				Object originalValue = pv.getValue(); // 属性值
			}
		}
		// 设置属性值
		bw.setPropertyValues(new MutablePropertyValues(deepCopy));

	}

明天再写

标签:生命周期,String,mbd,Spring,beanName,bean,属性
From: https://www.cnblogs.com/hardyzhou/p/17013641.html

相关文章

  • Spring AOP源码(四):具体执行流程 - 责任链模式
    1、AOP动态代理的字节码文件1.1、代理对象class的核心伪代码1publicclassMathCalculator$$EnhancerBySpringCGLIB$$9bfe5203extendsMathCalculatorimplementsS......
  • Springoot - 整合MyBatis
    1.导入JDBC驱动因为我的是Mysql数据库版本是8.0.20导入对应版本的驱动即可<!--mysql依赖--><dependency><groupId>mysql</groupId>......
  • 从Spring中学到的【2】--容器类
    容器类我们在实际编码中,常常会遇到各种容器类,他们有时叫做POJO,有时又叫做DTO,VO,DO等,这些类只具有容器的作用,具有完全的get,set方法,作为信息载体,作数据传输用。其实,很多地......
  • SpringBoot - WebMvcConfigurer 配置类
    WebMvcConfigurer:1.publicvoidconfigurePathMatch(PathMatchConfigurerconfigurer)路径匹配规则一般不用修改2.publicvoidconfigureContentNegotiation(ContentNe......
  • SpringBoot - 内容协商机制
    1.内容协商机制根据客户端接收能力不同,SpringBoot返回不同媒体类型的数据比如:客户端Http请求Accept:application/xml则返回xml数据,客户端Http请求Accept:a......
  • Spring声明式事务配置管理方法
    事务配置首先在/WEB-INF/applicationContext.xml添加以下内容:<!--配置事务管理器--><beanid="transactionManager"class="org.springframework.orm.hibernate3.Hibernat......
  • spring aop学习记录文档
    ProxyFactory:https://www.cnblogs.com/5207/p/6055152.htmlProxyConfig:https://www.cnblogs.com/mayang2465/p/12141814.htmlProxyFactory:https://juejin.cn/post/704079......
  • SpringBoot 的属性配置文件
    0、概述本文内容会解答下面几个问题:1、SpringBoot默认配置文件的名称是什么?配置文件默认存放位置是什么?2、如何指定配置文件名称?如何指定配置文件存放位置?3、如何使用pro......
  • Spring源码:ConfigFileApplicationListener
    /**Copyright2012-2017theoriginalauthororauthors.**LicensedundertheApacheLicense,Version2.0(the"License");*youmaynotusethisfileexcept......
  • Q1 SpringBoot启动类如何作为配置类注册进Spring容器的?(ok)
    @SpringBootApplicationpublicclassHelloSpringBoot{publicstaticvoidmain(String[]args){SpringApplication.run(HelloSpringBoot.class,args);}}......