spring 源码阅读(3) spring如何解决bean 依赖的问题?

大家好呀,我是小羊,如果大家喜欢我的文章的话😁,就关注我一起学习进步吧~

我们在使用spring的时候,如果一个bean依赖另外一个bean,我们操作看起来很简单,做一些简单的配置就可以了,比如 Autowired 或者是用 xml 配置,就像下面这样:

@Autowired
ServiceOrderService serviceOrderService;
<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="dog" class="org.springframework.yangzheng.Dog" >
  <property name="dogName" value="dog1"></property>
 </bean>

 <!-- 导入约束之后,即可在此处装配bean了 -->
 <bean id="person" class="org.springframework.yangzheng.Person" depends-on="dog">
  <property name="name" value="yangzheng"></property>
  <property name="age" value="13"></property>
  <property name="dog" ref="dog"></property>
 </bean>


</beans>

那么,这一块是怎么实现的呢,让我们从源码的角度,看下它内部的实现逻辑。

准备工作

我们这边准备使用 2个类  Person Dog 类,人 依赖 狗。

Person类

package org.springframework.yangzheng;

/**
 * @author yangzheng
 * @description
 * @date 2022/6/1 00112:38
 */

public class Person {
 private String name;
 public Integer age;
 private Dog dog;

 public Dog getDog() {
  return dog;
 }

 public void setDog(Dog dog) {
  this.dog = dog;
 }


 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() {
  return "Person{" +
    "name='" + name + ''' +
    ", age=" + age +
    ", dog=" + dog.toString() +
    '}';
 }
}

Dog 类

package org.springframework.yangzheng;

/**
 * @author yangzheng
 * @description
 * @date 2022/6/1 00112:38
 */

public class Dog {
 private String dogName;

 public String getDogName() {
  return dogName;
 }

 public void setDogName(String dogName) {
  this.dogName = dogName;
 }

 @Override
 public String toString() {
  return "Dog{" +
    "dogName='" + dogName + ''' +
    '}';
 }
}

applicationContext.xml 配置, 这里配置了 person 依赖类 dog

<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="dog" class="org.springframework.yangzheng.Dog" >
  <property name="dogName" value="dog1"></property>
 </bean>

 <!-- 导入约束之后,即可在此处装配bean了 -->
 <bean id="person" class="org.springframework.yangzheng.Person" depends-on="dog">
  <property name="name" value="yangzheng"></property>
  <property name="age" value="13"></property>
  <property name="dog" ref="dog"></property>
 </bean>


</beans>

Test 测试类

package org.springframework.yangzheng;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author yangzheng
 * @description
 * @date 2022/6/1 00112:40
 */

public class Test {
 public static void main(String[] args) {
  ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
  Person person = context.getBean("person", Person.class);
  System.out.printf("person:"+person.toString());
  Dog dog = context.getBean("dog", Dog.class);
  System.out.printf("dog:"+dog.toString());
 }
}

测试运行

spring 源码阅读(3) spring如何解决bean 依赖的问题?

运行正常,person bean 可以正常使用 dog bean。那么,这里的逻辑是怎么实现的呢?让我们从源码角度来看一下。

spring 源码阅读(3) spring如何解决bean 依赖的问题?

首先是 从context.getBean() 方法中获取 person 这个bean,后面会跳转到 doGetBean() 方法尝试获取这个 bean。(当然第一次获取的时候肯定是没有的,因为都没有创建)

spring 源码阅读(3) spring如何解决bean 依赖的问题?
spring 源码阅读(3) spring如何解决bean 依赖的问题?

没有拿到单例 person bean 之后,开始走创建 bean 的流程,spring会执行一个逻辑判断是否有依赖其他bean ,这里发现了 person 依赖了 dog bean.

spring 源码阅读(3) spring如何解决bean 依赖的问题?

尝试获取 dog bean(当然也是没有的,因为还没有创建)

spring 源码阅读(3) spring如何解决bean 依赖的问题?

没有发现dog bean 之后,尝试创建 dog bean

spring 源码阅读(3) spring如何解决bean 依赖的问题?
spring 源码阅读(3) spring如何解决bean 依赖的问题?

执行 doCreateBean() 方法 和 createBeanInstance() 方法来创建 dog bean

spring 源码阅读(3) spring如何解决bean 依赖的问题?

使用反射的方式创建 bean

spring 源码阅读(3) spring如何解决bean 依赖的问题?

属性赋值

spring 源码阅读(3) spring如何解决bean 依赖的问题?
spring 源码阅读(3) spring如何解决bean 依赖的问题?

这里就基本上把 dog 这个 bean 创建完了。然后是相同的流程 把 person 这个bean 创建完

spring 源码阅读(3) spring如何解决bean 依赖的问题?
spring 源码阅读(3) spring如何解决bean 依赖的问题?
spring 源码阅读(3) spring如何解决bean 依赖的问题?

这样就实现了 spring 的 依赖管理,可以看到,spring ioc 容器帮我们做了很多工作,我们只需要简单配置 一些 xml 或者 注解,就可以 实现 bean 的管理和使用。

喜欢我的话,可以给我点个赞呀。


原文始发于微信公众号(小羊架构):spring 源码阅读(3) spring如何解决bean 依赖的问题?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/259769.html

(0)
Java朝阳的头像Java朝阳

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!