44.深入学习Spring Boot自动装配

Spring Boot 2 基础篇学习笔记 Spring Boot 2 运维实用篇学习笔记实用篇学习要求环境要求学习资料基础篇Java基础语法 Spring与SpringMVC 知道Spring是用来管理bean,能够基于Restful实现页面请求交互功能 Mybatis与Mybatis-Plus 基于Mybatis和MybatisPlus能够开发出包含基础CRUD功能的标准Dao模块 数据库MySQL 能够读懂基础CRUD功能的SQL语句 服务器 知道服务器与web工程的关系,熟悉web服务器的基础配置 maven 知道maven的依赖关系,知道什 阅读详情

深入学习Spring Boot自动装配

1.模式注解

Stereotype Annotation俗称为模式注解,Spring中常见的模式注解有@Service,@Repository,@Controller等,它们都“派生”自@Component注解。我们都知道,凡是被@Component标注的类都会被Spring扫描并纳入到IOC容器中,那么由@Component派生的注解所标注的类也会被扫描到IOC容器中。下面我们主要来通过自定义模式注解来了解@Component的“派生性”和“层次性”。

1.1 @Component “派生性”

新建一个Spring Boot工程,Spring Boot版本为2.1.0.RELEASE,artifactId为autoconfig,并引入spring-boot-starter-web依赖。项目结构如下所示:

在com.example.demo下新建annotation包,然后创建一个FirstLevelService注解:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Service
public @interface FirstLevelService {
    String value() default "";
}

这个注解定义由@Service标注,查看@Service的源码会发现其被@Component注解标注,所以它们的层次关系为:

└─@Component
   └─@Service
      └─@FirstLevelService

即@FirstLevelService为@Component派生出来的模式注解,我们来测试一下被它标注的类是否能够被扫描到IOC容器中:

在com.example.demo下新建service包,然后创建一个TestService类:

@SecondLevelService
public class TestService {
}

在com.example.demo下新建bootstrap包,然后创建一个ServiceBootStrap类,用于测试注册TestService并从IOC容器中获取它:

@ComponentScan("com.example.demo.service")
public class ServiceBootstrap {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = new SpringApplicationBuilder(ServiceBootstrap.class)
                .web(WebApplicationType.NONE)
                .run(args);
        TestService testService = context.getBean("testService", TestService.class);
        System.out.println("TestService Bean: " + testService);
        context.close();
    }
}

运行该类的main方法,控制台输出如下:

1.2 @Component “层次性”

我们在com.example.demo.annotation路径下再创建一个SecondLevelService注解定义,该注解由上面的@FirstLevelService标注:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@FirstLevelService
public @interface SecondLevelService {
    String value() default "";
}

这时候层次关系为:

└─@Component
   └─@Service
      └─@FirstLevelService
            └─@SecondLevelService

我们将TestService上的注解换成@SecondLevelService,然后再次运行ServiceBootStrap的main方法,输出如下:

可见结果也是成功的。

这里有一点需要注意的是:@Component注解只包含一个value属性定义,所以其“派生”的注解也只能包含一个vlaue属性定义。

2. @Enable模块驱动

@Enable模块驱动在Spring Framework 3.1后开始支持。这里的模块通俗的来说就是一些为了实现某个功能的组件的集合。通过@Enable模块驱动,我们可以开启相应的模块功能。

@Enable模块驱动可以分为“注解驱动”和“接口编程”两种实现方式,下面逐一进行演示:

2.1 注解驱动

Spring中,基于注解驱动的示例可以查看@EnableWebMvc源码:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import({DelegatingWebMvcConfiguration.class})
public @interface EnableWebMvc {
}

该注解通过@Import导入一个配置类DelegatingWebMvcConfiguration:

@Configuration(
    proxyBeanMethods = false
)
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
    private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();

    public DelegatingWebMvcConfiguration() {
    }
	....
}

该配置类又继承自WebMvcConfigurationSupport,里面定义了一些Bean的声明。

所以,基于注解驱动的@Enable模块驱动其实就是通过@Import来导入一个配置类,以此实现相应模块的组件注册,当这些组件注册到IOC容器中,这个模块对应的功能也就可以使用了。

我们来定义一个基于注解驱动的@Enable模块驱动。

在com.example.demo下新建configuration包,然后创建一个HelloWorldConfiguration配置类:

@Configuration
public class HelloWorldConfiguration {

    @Bean
    public String hello() {
        return "hello world";
    }
}

这个配置类里定义了一个名为hello的Bean,内容为hello world。

在com.example.demo.annotation下创建一个EnableHelloWorld注解定义:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(HelloWorldConfiguration.class)
public @interface EnableHelloWorld {
}

我们在该注解类上通过@Import导入了刚刚创建的配置类。

接着在com.example.demo.bootstrap下创建一个TestEnableBootstap启动类来测试@EnableHelloWorld注解是否生效:

@EnableHelloWorld
public class TestEnableBootstap {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = new SpringApplicationBuilder(TestEnableBootstap.class)
                .web(WebApplicationType.NONE)
                .run(args);
        String hello = context.getBean("hello", String.class);
        System.out.println("hello Bean: " + hello);
        context.close();
    }
}

运行该类的main方法,控制台输出如下:

说明我们自定义的基于注解驱动的@EnableHelloWorld是可行的。

2.2 接口编程

除了使用上面这个方式外,我们还可以通过接口编程的方式来实现@Enable模块驱动。Spring中,基于接口编程方式的有@EnableCaching注解,查看其源码:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({CachingConfigurationSelector.class})
public @interface EnableCaching {
    boolean proxyTargetClass() default false;

    AdviceMode mode() default AdviceMode.PROXY;

    int order() default 2147483647;
}

EnableCaching注解通过@Import导入了CachingConfigurationSelector类,该类间接实现了ImportSelector接口,在 深入学习Spring组件注册 中,我们曾介绍了可以通过ImportSelector来实现组件注册。

所以通过接口编程实现@Enable模块驱动的本质是:通过@Import来导入接口ImportSelector实现类,该实现类里可以定义需要注册到IOC容器中的组件,以此实现相应模块对应组件的注册。

接下来我们根据这个思路来自个实现一遍:

在com.example.demo下新建selector包,然后在该路径下新建一个HelloWorldImportSelector实现ImportSelector接口:

public class HelloWorldImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{HelloWorldConfiguration.class.getName()};
    }
}

如果看不懂上面这段代码含义的朋友可以阅读 深入学习Spring组件注册一文。

接着我们修改EnableHelloWorld:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(HelloWorldImportSelector.class)
public @interface EnableHelloWorld {
}

上面导入的是HelloWorldImportSelector,而非HelloWorldConfiguration。

再次运行TestEnableBootstap的main方法,你会发现输出是一样的。

3.自动装配

Spring Boot中的自动装配技术底层主要用到了下面这些技术:

  • 1.Spring 模式注解装配

  • 2.Spring @Enable 模块装配

  • 3.Spring 条件装配装(深入学习Spring组件注册中有介绍)

  • 4.Spring 工厂加载机制

Spring 工厂加载机制的实现类为SpringFactoriesLoader,查看其源码:

该类的方法会读取META-INF目录下的spring.factories配置文件,我们查看spring-boot-autoconfigure-2.1.0.RELEASE.jar下的该文件:

当启动类被@EnableAutoConfiguration标注后,上面截图中的所有类Spring都会去扫描,看是否可以纳入到IOC容器中进行管理。

比如我们查看org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration的源码:

可看到该类上标注了一些注解,其中@Configuration为模式注解,@EnableConfigurationProperties为模块装配技术,ConditionalOnClass为条件装配技术。这和我们上面列出的Spring Boot自动装配底层主要技术一致,所以我们可以根据这个思路来自定义一个自动装配实现。

新建一个配置类HelloWorldAutoConfiguration:

@Configuration
@EnableHelloWorld
@ConditionalOnProperty(name = "helloworld", havingValue = "true")
public class HelloWorldAutoConfiguration {
}

然后在resources目录下新建META-INF目录,并创建spring.factories文件:

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.demo.configuration.HelloWorldAutoConfiguration

接着在配置文件application.properties中添加helloworld=true配置

helloworld=true

最后创建EnableAutoConfigurationBootstrap,测试下HelloWorldAutoConfiguration是否生效:

@EnableAutoConfiguration
public class EnableAutoConfigurationBootstrap {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = new SpringApplicationBuilder(EnableAutoConfigurationBootstrap.class)
                .web(WebApplicationType.NONE)
                .run(args);
        String hello = context.getBean("hello", String.class);
        System.out.println("hello Bean: " + hello);
        context.close();
    }
}

运行该main方法,控制台输出如下:

说明我们自定义的自动装配已经成功了。

下面简要分析下代码的运行逻辑:

  • 1.Spring 的工厂加载机制会自动读取META-INF目录下spring.factories文件内容;

  • 2.我们在spring.factories定义了:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.demo.configuration.HelloWorldAutoConfiguration`

我们在测试类上使用了@EnableAutoConfiguration注解标注,那么HelloWorldAutoConfiguration就会被Spring扫描,看是否符合要求,如果符合则纳入到IOC容器中;

  • 3.HelloWorldAutoConfiguration上的@ConditionalOnProperty的注解作用为:当配置文件中配置了helloworld=true(我们确实添加了这个配置,所以符合要求)则这个类符合扫描规则;@EnableHelloWorld注解是我们前面例子中自定义的模块驱动注解,其引入了hello这个Bean,所以IOC容器中便会存在hello这个Bean了;

  • 4.通过上面的步骤,我们就可以通过上下文获取到hello这个Bean了。

Spring Boot构建新疆特色文化在线教育平台:自动装配与核心实现解析 Spring Boot作为Java领域主流的微服务开发框架,凭借自动装配能力大幅简化了企业级应用的初始化与配置流程,使开发者能更专注于业务逻辑实现。在在线教育平台建设中,结合MyBatis-Plus持久层框架与Redis缓存,可高效处理课程资源分发、用户学习记录和高并发访问等典型场景。基于JWT的无状态认证与拦截器机制,则为前后端分离架构下的安全访问提供了简洁方案。以新疆特色文化在线教育平台为实践载体,从自动装配原理切入,梳理了系统分层、数据模型设计、核心业务实现、测试与部署优化等完整链路,帮助开发者理解从 阅读详情

相关推荐

Spring Boot宠物咖啡馆平台:从自动装配到打包交付的完整实践

Spring Boot的自动装配机制让开发者从繁琐的XML配置中解放出来,通过条件注解与导入文件,数据源、事务管理器等核心组件得以按需装配,这是现代Java后端工程化开发的基础。合理的事务边界设计则是业务正确性的关键,尤其在涉及预约并发、库存扣减和支付回调等场景时,乐观锁与幂等策略能有效避免数据错乱。同时,工程化能力体现在项目打包、配置管理和部署验证等环节,一个可交付的zip包往往涵盖源码、数据库脚本、可运行jar与部署文档。以宠物咖啡馆平台为例,其核心业务围绕宠物档案、预约寄养、咖啡点单与会员储值展开,清

weixin_31742871的博客 264

一个比Spring Boot快44倍的Java框架!

最近栈长看到一个框架,官方号称可以比 Spring Boot 快 44 倍,居然这么牛逼,有这么神奇吗?今天带大家来认识一下。 这个框架名叫:light-4j。 官网简介:A fast, lightweight and more productive microservices framework 很简单,翻译过来就是:一个快速、轻量级和更高效的微服务框架。 为什么叫light-4j? 全称应...

Java技术栈,分享最主流的Java技术 1万+

Spring Boot音乐网站实战:从分层架构到自动装配原理

Spring Boot作为Java后端开发的主流框架,其自动装配机制让项目初始化与组件集成变得高效。它通过条件注解动态加载配置,为分层架构、持久层映射等基础能力提供支撑。在前后端分离的Web应用中,常见需求与Spring Boot、MyBatis及Vue技术栈紧密相关,例如JWT身份认证、Restful API设计、音视频文件流式传输。基于Spring Boot的音乐网站正是这一技术组合的典型实践,覆盖用户登录鉴权、歌曲分类、试听与下载、后台管理等场景,并借助批处理脚本实现一键构建部署。文章从工程化视角剖析

weixin_31856057的博客 130

44、Spring Boot 详细讲义(一)

springboot详细讲义

qq_22910257的博客 1218

Android Studio安装常见问题详解——Android Emulator Hypervisor Driver for AMD Processors installation failed.

目录一、问题描述二、解决方案2.1 开启CPU虚拟化2.2 禁用Hyper-V2.3 使用管理员命令行在驱动程序包中执行“silent_install.bat” 一、问题描述 新买的AMD轻薄本,在安装Android Studio时遇到问题: Android Emulator Hypervisor Driver for AMD Processors installation failed. 笔记本配置为: 二、解决方案 2.1 开启CPU虚拟化 设置虚拟化的步骤这里不进行详细介绍了。如果需要,可以自行百

Wendy的博客 4万+

C2000 CLA协处理器:嵌入式实时控制性能优化与实战指南

在嵌入式实时控制系统中,主CPU常因高频率、低延迟的控制算法而面临性能瓶颈。为解决此问题,协处理器技术应运而生,它通过硬件并行架构分担计算密集型任务,从而提升系统整体性能。其核心原理在于独立的计算单元与总线设计,能够实现近乎零延迟的响应,这对于电机驱动、数字电源等闭环控制场景具有极高的技术价值。本文聚焦于德州仪器C2000系列微控制器中的控制律加速器(CLA),深入解析其作为独立浮点协处理器如何通过任务调度与消息RAM通信机制,有效实现性能倍增,并提供了从内存配置到代码调试的完整工程实践方案。

weixin_29192211的博客 305

一个比 Spring Boot 快 44 倍的 Java 框架

来源:https://www.jdon.com/48511 light-java是内置了undertow http服务器的REST微服务轻量Java框架,它比Spring Boot内嵌Tomcat这样流行的微服务平台要快44倍,与Go语言fast-http性能接近。基准测试 特点: 1.带有启动停止的插件架构和中间价组件。 2.分布式OAuth2 JWT安全验证 3.基于OpenAPI的...

勇往直前的专栏 792

【CAPL实用开发】--- 使用VN1640A测试Busoff快慢恢复

使用VN1640A测试Busoff快慢恢复,包含具体的CAPL代码实现。

LabVIEW、CAPL、python、车载以太网等学习分享,文章正在写 2098

2022 年学习 Spring Boot 开发的最佳书籍

编码密码和验证用户保护端点自动化安全测试设置独立的授权服务器ISO-Gruppe 的 Alain Lompo 由 20 个完整的章节组成,对该资源的评价如下:“知识、合理建议和实际应用的金矿。我希望我在几年前学习 Spring Security 时也能有这样的东西。”将这份副本放在您的手中,您将获得同样的体验。从下面的亚马逊订购。

m0_74825614的博客 1260

从PX4的FRD到Mavros的FLU:手把手教你正确配置`setpoint_raw/local`话题发布无人机目标点

本文详细解析了PX4的FRD与Mavros的FLU坐标系转换问题,手把手教你正确配置`setpoint_raw/local`话题发布无人机目标点。通过实战指南和常见错误排查,帮助开发者避免方向错乱问题,提升无人机控制精度。

weixin_33712987的博客 422

用R搞定生态溯源:MixSIAR贝叶斯混合模型从安装到出图的保姆级教程

本文提供了一份详细的MixSIAR贝叶斯混合模型教程,涵盖从R环境配置、数据预处理到模型参数设置和可视化分析的完整流程。通过实战案例和常见问题解决方案,帮助生态学研究者快速掌握混合模型在生态溯源中的应用,提升数据分析效率。

weixin_42531516的博客 469

Spring Boot 44种应用启动器

spring Boot应用启动器基本的一共有44种,具体如下: 1)spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置、日志和YAML。 2)spring-boot-starter-actuator 帮助监控和管理应用。 3)spring-boot-starter-amqp 通过spring-rabbit来支持AMQP协议(Advanced Messag...

qq_38285661的博客 261

基于单片机的自动喷淋系统设计【毕业设计】

随着人民生活质量提高与生活节奏的加快,城市居民对于花草绿植的家庭培养与装饰需求增加,随之因浇灌植物的需要,智能浇花系统的市场逐渐扩大。现有自动浇花系统大部分只能通过设置固定浇水时间而难以实现适时、适量浇水,或在植物环境土壤含水量低时进行报警而并不能实际补水。为克服局限性而设计以单片机为控制中心的自动浇花系统。通过湿度传感器检测目标植物环境土壤湿度数据,再经ADCO832将其放大转换为数字量,由单片机读取输出向LCD1602 显示屏显示并通过比对键盘向单片机所设置的湿度范围而利用中断服务程序进行补水需求判断。

qq_48771816的博客 1712

据说一个比Spring Boot快44倍的Java框架!

官方号称可以比 Spring Boot 快 44 倍,居然这么牛逼,有这么神奇吗?今天带大家来认识一下。 这个框架名叫:light-4j。 官网简介:A fast, lightweight and more productive microservices framework 很简单,翻译过来就是:一个快速、轻量级和更高效的微服务框架。 为什么叫light-4j? 全称应...

sinat 12万+

Halcon算子知识:optical_flow_mg

光流(Optical Flow)是一种研究图像对齐的算法,一般包括两大类:稀疏光流和稠密光流。稀疏光流就是研究图像中稀疏点的光流,这些点一般是角点;稠密光流则是研究图像中所有点的偏移量。以下介绍halcon的基本光流算子optical_flow_mg的原理方法。该算子计算两个图片的光流法。 二、算子说明 optical_flow_mg(ImageT1, ImageT2 : VectorField : Algorithm, SmoothingSigma, Integration

gongdiwudu的专栏 1万+

Mac版 Android Studio自带模拟器无法联网解决方案

前言 作为一枚安卓开发者,免不了使用模拟器来开发调试(毕竟它比手机方便太多)。但是因为适配需要,我们会更多的使用真机开发调试,那么当模拟器遇到这样那样的问题,我们往往会无从下手,其中最烦的就是网络问题。 我最近图方便,又重新用起了模拟器,但是发现联网失败,用模拟器内置的浏览器也打不开网页,于是百度上一通找,毫无效果,各种说用cmd命令行设置模拟器dns的都没用,显示没有什么dns文件啥的,后来...

陈万洲的专栏 1万+

Spring Boot 配置文件pom.xml中44种启动器

启动类与启动器区别: ① 启动类表示项目的启动入口。 ② 启动器表示 jar 包的坐标。 启动类:springboot的启动类的作用是启动 Spring Boot 项目,是基于 Main 方法来运行的。注意:启动类在启动时会做注解扫描( @Controller 、@Service 、@Repository … … ),扫描位置为同包或者子包下的注解,所以启动类的位置应放于包的根下。 启动器:SpringBoot将所有的功能场景都抽取出来,做成一个个的starter启动器,只需要在项目里面引入这些starte

LQS_Service的博客 398

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

spring-boot提供的44个启动器依赖

Spring Boot应用启动器基本的一共有44种,具体如下: 1.spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置、日志和YAML。 2.spring-boot-starter-actuator 帮助监控和管理应用。 3.spring-boot-starter-amqp 通过spring-rabbit来支持AMQP协议(Advanced Messag...

LDF_WICIQI的博客 937

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Spring Boot 44种启动器

spring Boot应用启动器基本的一共有44种,具体如下:1)spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置、日志和YAML。2)spring-boot-starter-actuator 帮助监控和管理应用。3)spring-boot-starter-amqp 通过spring-rabbit来支持AMQP协议(Advanced Message Q...

向日的知识小站 333

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

44种基本的Spring Boot应用启动器

Spring Boot应用启动器 spring Boot应用启动器基本的一共有44种,具体如下: 1)spring-boot-starter  这是Spring Boot的核心启动器,包含了自动配置、日志和YAML。 2)spring-boot-starter-actuator  帮助监控和管理应用。 3)spring-boot-starter-amqp  通过spring-rabbit来...

Deltao_Taic的博客 277

《Java 100 天进阶之路》第78篇:Spring Boot自动配置(2026版)

每天用@SpringBootApplication,但你知道背后的魔法吗?一文掌握自动配置核心链路(@SpringBootApplication→@EnableAutoConfiguration→AutoConfigurationImportSelector→SPI加载→条件过滤→Bean注册)、@SpringBootApplication三大组成注解、Spring Boot 3.x重大变化(废弃spring.factories,改用.imports文件)、6种条件注解

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 6590

44种Spring Boot应用启动器你懂了吗?

spring Boot应用启动器基本的一共有44种,具体如下: 1)spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置、日志和YAML。 2)spring-boot-starter-actuator 帮助监控和管理应用。 3)spring-boot-starter-amqp 通过spring-rabbit来支持AMQP协议(Advanced Messag...

Apple_Boy的博客 369

可执行 jar 和普通 jar 区别

可执行 jar 和普通 jar 区别 在我们的项目中使用IDEA可以将项目打包,可以打成可执行jar和普通的jar包,那么这两种jar有什么区别呢? 1.打包插件 Spring Boot 中默认打包成的 jar 叫做 可执行 jar,这种 jar 不同于普通的 jar,普通的 jar 不可以通过 java -jar xxx.jar 命令执行,普通的 jar 主要是被其他应用依赖,Spring Bo...

MissOfSpring的博客 4391
上一篇: Swagger与YApi的干柴烈火,瞬间沸腾了
下一篇: Scrapy 库安装还装不上?那么你来喵一眼绝对好使
Spring的思念
博客等级 码龄7年 80粉丝 143原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值