美文网首页
Spring 依赖注入原理

Spring 依赖注入原理

作者: IT小分享 | 来源:发表于2021-07-20 09:01 被阅读0次

有时所在项目忙于业务快速迭代,只知道如何应用框架组件,底层原理却忽略了,框架许多精妙设计没掌握到。每天重复流水线工作,业务层面有所提升,但技术原地不动,每次热情高涨探索底层实现,由于种种原因,坚持没多久就放弃了。为了解开放弃探索小伙伴们心中疑惑,本人花了一些时间研究了底层实现。此次分享学习心得为Spring 依赖注入原理,在实际项目中最常见的依赖注入场景,跨业务注解服务互相调用,配置文件引用第三方服务时信息配置。

一 什么是依赖注入

通过类setXxx函数,有参构造函数或注解形式为类的成员属性附上值

二 依赖注入有以下方法

下面这几张注入方式经常碰到,在工作一段时间后,沉下心翻看源码后,多年的疑惑才解开。

1 通过xml配置文件为类实例属性附上值常用有

1.1 bean子标签<property name="name" value="test"/> 标签配上值,property标签的name属性值在类中需要对应public权限setXxx函数如下

XML文件配置

<bean id="dataSource" class="test.Db">

<property name="name" value="QQ"/>

</bean>

JAVA类构建

package test;

public class Db {

private String name;

public void setName(String name) {

this.name = name;

}

}

1.2 bean子标签<constructor-arg name="name" value="test"/> 标签配上值,constructor-arg标签的name属性值,在类中构造函数需要对应参数如下

XML文件配置

<bean id="dataSource" class="test.Db" >

        <constructor-arg name="name" value="qq"/>

</bean>

JAVA类构建

public class Db {

private String name;

public Db(String name) {

this.name = name;

}

}

2 类属性加上属性自动注入注解

package test;

public class Db {

@Value("${name}")

private String name;

}

package test;

public class Db {

@Autowired

private X x;

}

package test;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.stereotype.Controller;

import org.springframework.stereotype.Service;

@Service

public class X {

}

三 依赖注入原理

上面的几种形式在实际项目经常碰到,如何实现呢?

1 基于bean子标签property注入原理

1.1 加载bean配置文件,解析bean标签属性值,赋值给BeanDefinition实例并存进集合中,执行

finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory),实例化bean(使用反射技术实例化)。

再调用populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw),内部执行使用反射技术(

ReflectionUtils.makeAccessible(writeMethod);

writeMethod.invoke(getWrappedInstance(), value); writeMethod为Method实例),最后调用函数setXxx为属性赋值。

2 基于bean子标签constructor-arg注入原理

2.1 加载bean配置文件,解析bean标签属性值,赋值给BeanDefinition实例并存进集合中,执行

finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory),当bean的factoryMethodName属性值为空,bean的有参构造函数多个且调用了。执行函数autowireConstructor(String beanName, RootBeanDefinition mbd, @Nullable Constructor<?>[] ctors, @Nullable Object[] explicitArgs)传入参数。

通过BeanDefinition的成员属性constructorArgument获取构造函数参数,

再执行函数

resolveConstructorArguments(String beanName, RootBeanDefinition mbd, BeanWrapper bw,ConstructorArgumentValues cargs, ConstructorArgumentValues resolvedValues)传入参数,循环遍历构造函数实例,获取出匹配的构造函数。

通过反射实例化并通过构造函数参数为类属性赋值(即执行ctor.newInstance(argsWithDefaultValues),ctor为Constructor<T>类型)。

3 基于注解注入待续

相关文章

  • Spring 依赖注入原理

    有时所在项目忙于业务快速迭代,只知道如何应用框架组件,底层原理却忽略了,框架许多精妙设计没掌握到。每天重复流水线工...

  • Spring 原理概述

    Spring 原理概述 Spring 两大核心:控制反转(IoC)/ 依赖注入(DI)面向切面(AOP) 控制反转...

  • Spring AOP 源码解析

    写在前面   在分析 Spring AOP 源码之前,如果你对 Spring IOC、依赖注入(DI) 原理不是很...

  • Spring MVC 源码解析

    写在前面   在分析 Spring AOP 源码之前,如果你对 Spring IOC、依赖注入(DI) 原理不是很...

  • Spring Transaction 源码解析

    写在前面   在分析 Spring AOP 源码之前,如果你对 Spring IOC、依赖注入(DI) 原理不是很...

  • Spring学习手册(5)—— bean作用域

    Spring学习手册(4)—— Spring 依赖注入中介绍了Spring依赖注入的基本方式以及各种类型的参数注入...

  • Java 反射 reflection

    spring源代码,其基本原理如依赖注入、aop、以及xml技术,动态反射机制 Reflection 学习反射原理...

  • 依赖注入(转)

    依赖注入(转) 原文地址:依赖注入原理

  • 注解

    依赖注入的注解的原理: 1、当启动spring容器的时候,创建两个对象2、当spring容器解析到 spring容...

  • Day60 Spring底层核心原理解析

    Bean 生命周期底层原理 依赖注入底层 初始化,推断构造 Aop 底层 Spring事务底层原理 解析Annot...

网友评论

      本文标题:Spring 依赖注入原理

      本文链接:https://www.haomeiwen.com/subject/hsdlmltx.html