学习SpringBoot,绝对避不开自动装配这个概念,这也是SpringBoot的关键之一
本人同样是SpringBoot的初学者,下面的一些总结都是结合个人理解和实践得出的,如果有错误或者疏漏,请一定帮我指出,在评论区回复即可,一起学习!
篇幅较长,希望你可以有耐心。
如果只关心SpringBoot装配过程,可以直接跳到第7部分
想要理解SpringBoot的自动装配机制,需要清晰以下两个问题:
- 装配,装配什么内容?
- 自动,如何实现自动?
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自动装配原理,这一篇就够了!分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/78639.html