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

SpringBoot自动装配原理,这一篇就够了!有关 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; private Integer age; private Boolean sex; private Dog dog
今天的文章 SpringBoot自动装配原理,这一篇就够了!分享到此就结束了,感谢您的阅读。
编程小号
上一篇 2024-12-05 11:11
下一篇 2024-12-05 11:06

相关推荐

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