SpringBoot自动装配原理,这一篇就够了!

学习SpringBoot,绝对避不开自动装配这个概念,这也是SpringBoot的关键之一

本人同样是SpringBoot的初学者,下面的一些总结都是结合个人理解和实践得出的,如果有错误或者疏漏,请一定帮我指出,在评论区回复即可,一起学习!

篇幅较长,希望你可以有耐心。

如果只关心SpringBoot装配过程,可以直接跳到第7部分

想要理解SpringBoot的自动装配机制,需要清晰以下两个问题:

  1. 装配,装配什么内容?
  2. 自动,如何实现自动?

2024-04-30 作者注:
SpringBoot 3.x时代已经到来,这篇文章仅适合低于2.7.0版本的SpringBoot。在2.7.0版本出现了一个全新的注解:@AutoConfiguration,围绕该全新注解进行了一系列改动,直接阅读源码貌似是个不错的选择,其具体装配过程细节有变化,但是思路是完全相同的。
除此之外可以尝试使用@AutoConfiguration构建自己的自动配置包

2023-02-23 作者注:
文章已经过去了3年之久,关于有些朋友可能会质疑文章的时效性问题:文章的前一部分确实单独使用了Spring,还需要引入Spring的各种依赖jar;这三年中SpringCloud解决方案逐渐成熟,单Spring应用除了老项目近乎已经绝迹,而SpringBoot作为Cloud的背后支柱与快速开发个人项目比较好用的框架仍然具有学习价值。
我本人目前也从学生转为某主力语言为Java大厂的后端研发,夜深工作之后回头看当初稚嫩的文字、略带青涩的表述、评论朋友们热烈的讨论…我想技术终究有一天会过时,更可贵的是渴望探索的灵魂、面对未知的激情。



1. Warm up

在开始之前,让我们先来看点简单的开胃菜:Spring中Bean依赖注入的三种方式

首先我们先来一个Person类,这里为了篇幅长度考虑使用了lombok

/**
 * @author dzzhyk
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
   
   
    private String name;
    private Integer age;
    private Boolean sex;
}

1.1 setter注入

这是最基本的注入方式

首先我们创建applicationContext.xml文件,在里面加入:

<!-- 手动配置bean对象 -->
<bean id="person" class="pojo.Person">
    <property name="name" value="dzzhyk"/>
    <property name="age" value="20"/>
    <property name="sex" value="true"/>
</bean>

2023-02-23 作者注:不熟悉旧Spring开发的朋友可能会对xml配置感到陌生,目前流行的做法是使用注解@Bean,这里了解下xml即可

这里使用property为bean对象赋值

紧接着我们会在test包下写一个version1.TestVersion1类

/**
 * 第一种bean注入实现方式 - 在xml文件中直接配置属性
 */
public class TestVersion1 {
   
   
    @Test
    public void test(){
   
   
        ApplicationContext ca = new ClassPathXmlApplicationContext("applicationContext.xml");
        Person person = ca.getBean("person", Person.class);
        System.out.println(person);
    }
}

这里我使用了ClassPathXmlApplicationContext来加载Spring配置文件并且读取其中定义的bean,然后使用getBean方法使用id和类来获取这个Person的Bean对象,结果成功输出:

Person(name=dzzhyk, age=20, sex=true)

1.2 构造器注入

接下来是使用构造器注入,我们需要更改applicationContext.xml文件中的property为construct-arg

<!-- 使用构造器 -->
<bean id="person" class="pojo.Person">
    <constructor-arg index="0" type="java.lang.String" value="dzzhyk" />
    <constructor-arg index="1" type="java.lang.Integer" value="20"/>
    <constructor-arg index="2" type="java.lang.Boolean" value="true"/>
</bean>

2023-02-23 作者注:2023年了,在构造方法上使用@Autowired注解是构造器注入更明智的选择

version2.TestVersion2内容不变:

public class TestVersion2 {
   
   
    @Test
    public void test(){
   
   
        ApplicationContext ca = new ClassPathXmlApplicationContext("applicationContext.xml");
        Person person = ca.getBean("person", Person.class);
        System.out.println(person);
    }
}

依然正常输出结果:

Person(name=dzzhyk, age=20, sex=true)

1.3 属性注入

使用注解方式的属性注入Bean是比较优雅的做法

首先我们需要在applicationContext.xml中开启注解支持和自动包扫描:

<context:annotation-config />
<context:component-scan base-package="pojo"/>

在pojo类中对Person类加上@Component注解,将其标记为组件,并且使用@Value注解为各属性赋初值

@Component
public class Person {
   
   
    
    @Value("dzzhyk")
    private String name;
    @Value("20")
    private Integer age;
    @Value("true")
    private Boolean sex;
}

2023-02-23 作者注:目前来看,使用@Bean直接创建一个有属性的待管理的bean,然后使用@Autowired拿到person实例即可

然后添加新的测试类version3.TestVersion3

public class TestVersion3 {
   
   
    @Test
    public void test(){
   
   
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        Person person = ac.getBean("person", Person.class);
        System.out.println(person);
    }
}

运行也可以得到如下结果:

Person(name=dzzhyk, age=20, sex=true)


2. Warm up again

什么?还有什么?接下来我们来聊聊Spring的两种配置方式:基于XML的配置和基于JavaConfig类的配置方式,这对于理解SpringBoot的自动装配原理是非常重要的。

首先我们在Person的基础上再创建几个pojo类:这个Person有Car、有Dog

public class Car {
   
   
    private String brand;
    private Integer price;
}

public class Dog {
   
   
    private String name;
    private Integer age;
}

public class Person {
   
   
    private String name;
    
评论 105
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值