手写一个starter来理解SpringBoot的自动装配

这篇具有很好参考价值的文章主要介绍了手写一个starter来理解SpringBoot的自动装配。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

自动装配以及简单的解析源码

自动装配是指SpringBoot在启动的时候会自动的将系统中所需要的依赖注入进Spring容器中
我们可以点开@SpringBootApplication这个注解来一探究竟
手写一个starter来理解SpringBoot的自动装配,SSM框架,spring boot,后端,java
点开这个注解可以发现这些
手写一个starter来理解SpringBoot的自动装配,SSM框架,spring boot,后端,java
我们点开@SpringBootConfiguration这个注解
手写一个starter来理解SpringBoot的自动装配,SSM框架,spring boot,后端,java
可以发现实际上@SpringBootApplication这个其实是一个配置类
再点开@EnableAutoConfiguration(允许自动配置)这个注解,
手写一个starter来理解SpringBoot的自动装配,SSM框架,spring boot,后端,java
在这里最重要的是@AutoConfigurationPackage@Import这两个注解
@AutoConfigurationPackage这个注解的作用是扫描与启动类同目录底下的所有包以及其子包,将相关的Bean注入进Spring容器中
@Import注解则是将AutoConfigurationImportSelector.class将这个类作为Bean注入进Spring容器中,我们再点开这个类来看看
手写一个starter来理解SpringBoot的自动装配,SSM框架,spring boot,后端,java
找到这个方法,然后再点 loadFactoryNames这个方法
手写一个starter来理解SpringBoot的自动装配,SSM框架,spring boot,后端,java
我们可以看到这段代码,这段代码的意思就是说,加载META-INF/spring.factories 这个目录底下的配置类到Spring容器里面,再根据配置类来生成相应的Bean对象
所以说这两个注解,一个是将同一个项目里面的bean注入进Spring容器中,另外一个注解是将别人写好的配置类里面的Bean注入进Spring容器中

手写一个starter帮助理解自动装配

手把手教学

首先创建一个maven工程,名字应该是xxx-spring-boot-starter(Spring官方规定,如果是第三方的starter命名规则应该是xxx-spring-boot-starter,而Spring官方的starter应该是spring-boot-xxx-starter)
创建好了以后添加如下依赖

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.2</version>
    </parent>


    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>
    </dependencies>

然后我们创建两个类
手写一个starter来理解SpringBoot的自动装配,SSM框架,spring boot,后端,java
ConfigProperties 这个类是与Spring的配置文件关联的,配置文件中的值会被注入相应的字段中
@ConfigurationProperties(prefix = "dxg")这个注解的意思就是,在配置文件中相关配置前缀是什么

package com.DXG.config;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "dxg")
public class ConfigProperties {
    private Integer age;
    private String name;

    public ConfigProperties(){
    }

    public ConfigProperties(Integer age, String name) {
        this.age = age;
        this.name = name;
    }


    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

然后我们再编写这个配置类

@Configuration
@EnableConfigurationProperties(ConfigProperties.class)
public class ConfigPropertiesAutoConfiguration {
    public ConfigProperties configProperties;

    public ConfigPropertiesAutoConfiguration(ConfigProperties configProperties){
        this.configProperties = configProperties;
    }
}

在这个配置类中,首先打上@Configuration这个注解表明这是一个配置类
然后再打上@EnableConfigurationProperties(ConfigProperties.class)这个注解,这个注解的意思是让使用了@ConfigurationProperties(prefix = "dxg")ConfigProperties.class注入进IOC容器中
然后我们就可以根据配置来生成相应的Bean了,比如我们编写了两个Bean

    @Bean
    public TestService testService(){
        return new TestService(configProperties.getAge(), configProperties.getName());
    }

    @Bean
    public TestService1 testService1(){
        return new TestService1(configProperties.getAge());
    }
package com.DXG.service;


public class TestService {
    private Integer age;
    private String name;

    public TestService(Integer age, String name) {
        this.age = age;
        this.name = name;
    }

    @Override
    public String toString() {
        return "ConfigProperties{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

package com.DXG.service;

public class TestService1 {
    private Integer age;

    public TestService1(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "TestService1{" +
                "age=" + age +
                '}';
    }
}

最重要的一步来了,我们需要在META-INF这个目录下面创建spring.factories这个文件
手写一个starter来理解SpringBoot的自动装配,SSM框架,spring boot,后端,java
在这里面输入我们的配置类,这样才能被SpringBoot扫描到然后加载进Spring容器里面生成相应的Bean

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    com.DXG.config.ConfigPropertiesAutoConfiguration

然后我们打包这个项目,生成相应的jar包
手写一个starter来理解SpringBoot的自动装配,SSM框架,spring boot,后端,java
接下来我们就需要测试自动装配到底有没有生效了
在创建一个项目然后引入这个jar包

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.2</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.DXG</groupId>
            <artifactId>test-spring-boot-starter</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

编写相应的代码来进行测试

手写一个starter来理解SpringBoot的自动装配,SSM框架,spring boot,后端,java

package com.DXG.controller;

import com.DXG.service.TestService;
import com.DXG.service.TestService1;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
@RequestMapping("/test/")
public class TestController {

    @Resource
    private TestService testService;

    @Resource
    private TestService1 testService1;

    @RequestMapping("/testString")
    public String testString(){
        return testService.toString();
    }

    @RequestMapping("/testString1")
    public String testString1(){
        return testService1.toString();
    }
}

在配置文件里面填写相应的配置

server:
  port: 8080

dxg:
  age: 12
  name: "DXG"

接下来启动SpringBoot项目
手写一个starter来理解SpringBoot的自动装配,SSM框架,spring boot,后端,java
手写一个starter来理解SpringBoot的自动装配,SSM框架,spring boot,后端,java
可以看到,确实是将两个Bean都注入进Spring容器中供我们使用了

总结

接下来画个流程图总结一下
手写一个starter来理解SpringBoot的自动装配,SSM框架,spring boot,后端,java文章来源地址https://www.toymoban.com/news/detail-818010.html

到了这里,关于手写一个starter来理解SpringBoot的自动装配的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何理解SpringBoot的Starter

    Starter是SpringBoot的四大核心功能特性之一 ,除此之外,SpringBoot还有自动装配,Actuator监控等特性 SpringBoot里面的这些特性,都是为了让开发者在开发基于Spring生态下的企业级应用时,只需要关系业务逻辑,减少对配置和外部环境的依赖 Starter是启动依赖,它的主要作用有几个:

    2024年02月09日
    浏览(30)
  • Springboot的自动装配解读

    目录   1.Springboot的自动装配 1.1 组件装配 1.1.1 组件 1.2 Spring Framework 的模块装配 1.2.1 @Import注解 1.2.2 BeanDefinition  1.3 Spring Framework 的条件装配 1.3.1 @Profile 1.3.2 @Conditional  1.3.3 MetaData元数据接口(补充) AnnotatedTypeMetadata AnnotationMetadata MethodMetadata  1.4 SPI机制 1.5 Springboot 的装配机

    2024年02月11日
    浏览(31)
  • springBoot 自动装配

    1.前言 自动装配则是 SpringBoot 的核心,自动装配是如何实现的呢?为什么我们只要引入一个 starter 组件依赖就能实现自动装配呢,接下来就让我们一起来探讨下 SpringBoot 的自动装配机制 2.自动装配原理 提到自动装配,那么你首先得知道JDK的SPI(serviceproviderinterface)机制,因为

    2024年02月09日
    浏览(30)
  • SpringBoot源码-自动装配

      springboot的核心注解@SpringBootApplication 接着看 @SpringBootApplication 注解 截图: 代码:  接着看红框的注解 @EnableAutoConfiguration 截图: 代码:  接着看红框的 AutoConfigurationImportSelector.class 这个类 截图: 接着看接口 DeferredImportSelector 的实现 截图: 在这个DeferredImportSelector类中,

    2024年02月08日
    浏览(28)
  • springBoot自动装配机制

    自动配置原理 @SpringBootApplication 是一个组合注解,由 @ComponentScan、@EnableAutoConfiguration 和 @SpringBootConfiguration 组成 @SpringBootConfiguration 与普通 @Configuration 相比,唯一区别是前者要求整个 app 中只出现一次 @ComponentScan excludeFilters - 用来在组件扫描时进行排除,也会排除自动配置类

    2024年02月08日
    浏览(37)
  • springboot自动装配大概原理

    自动装配 : pom.xml spring-boot-dependence:核心都依赖在父类工程中! 我们在写入或者引入springboot依赖的时候,不需要指定版,因为有这些仓库的版本 启动器:------spring boot的启动场景 比如spring-boot-starter-web,他就会帮我们导入web环境苏需要的依赖。 springboot会将所有的功能场景

    2023年04月25日
    浏览(26)
  • SpringBoot自动装配原理

            自动装配简单来说就是自动去把第三方的组件bean加载到springIOC容器当中,不需要开发人员再去写bean相关的配置,springboot应用里面只需要把@SpringbootApplication注解加在启动类上边,就可完成自动配置的功能,而@SpringbootApplication是一个复合注解,真正完成自动配置功

    2024年01月22日
    浏览(36)
  • springboot启动流程 (3) 自动装配

    在SpringBoot中,EnableAutoConfiguration注解用于开启自动装配功能。 本文将详细分析该注解的工作流程。 启用SpringBoot自动装配功能,尝试猜测和配置可能需要的组件Bean。 自动装配类通常是根据类路径和定义的Bean来应用的。例如,如果类路径上有tomcat-embedded.jar,那么可能需要一个

    2024年02月09日
    浏览(32)
  • SpringBoot自动装配原理及分析

    在使用SpringBoot的时候,会自动将Bean装配到IOC容器中。例如我们在使用Redis数据库的时候,会引入依赖spring-boot-starter-data-redis。在引入这个依赖后,服务初始化的时候,会将操作Redis需要的组件注入到Ioc容器中进行后续使用。 自动装配的大致过程如下: 获取到组件(spring-boo

    2024年01月21日
    浏览(32)
  • 一文足够,SpringBoot自动装配底层源码

    目录 自动装配原理 开始深入源码 总结自动装配原理 首先明白一个概念,什么是自动装配? 我们在项目中建一个yaml或者properties文件,里面配置一些参数,如redis,在pom中引入启动器,之后就能用redis,自动把这些集成到spring中,这就是自动装配。 先来提前剧透: 加载spring.

    2023年04月13日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包