【Spring Boot自动装配原理详解与常见面试题】—— 每天一点小知识

💧 S p r i n g B o o t 自动装配原理详解与常见面试题 \color{#FF1493}{Spring Boot自动装配原理详解与常见面试题} SpringBoot自动装配原理详解与常见面试题💧


🌷 仰望天空,妳我亦是行人.✨

🦄 个人主页------微风撞见云的博客🎐
🐳 《数据结构与算法》专栏的文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺
💧 《Java学习笔记》专栏的文章是本人在Java学习中总结的一些知识点~ 💐
🥣 《每天一点小知识》专栏的文章可以丰富你的知识库,滴水成河~ 🌊
🪁 希望本文能够给读者带来一定的帮助~🌸文章粗浅,敬请批评指正!🐥


文章目录

  • [🐳 Spring Boot自动装配原理详解与常见面试题](#🐳 Spring Boot自动装配原理详解与常见面试题)
    • [1. 前言](#1. 前言)
    • [2. Spring Boot自动装配原理](#2. Spring Boot自动装配原理)
      • [2.1 条件化配置](#2.1 条件化配置)
        • [2.1.1 @ConditionalOnClass](#2.1.1 @ConditionalOnClass)
        • [2.1.2 @ConditionalOnBean](#2.1.2 @ConditionalOnBean)
      • [2.2 组件扫描](#2.2 组件扫描)
        • [2.2.1 示例:自动注册组件](#2.2.1 示例:自动注册组件)
      • [2.3 自动配置类](#2.3 自动配置类)
        • [2.3.1 示例:自动配置数据源](#2.3.1 示例:自动配置数据源)
    • [3. 示例代码](#3. 示例代码)
      • [3.1 创建主启动类](#3.1 创建主启动类)
      • [3.2 自定义自动配置类](#3.2 自定义自动配置类)
      • [3.3 自定义配置属性类](#3.3 自定义配置属性类)
      • [3.4 使用自定义的HelloWorldService](#3.4 使用自定义的HelloWorldService)
    • [4. 常见面试题](#4. 常见面试题)
      • [4.1 Spring Boot的自动装配原理是什么?](#4.1 Spring Boot的自动装配原理是什么?)
      • [4.2 @ConditionalOnBean和@ConditionalOnClass有什么区别?](#4.2 @ConditionalOnBean和@ConditionalOnClass有什么区别?)
      • [4.3 如何自定义自己的自动配置类?](#4.3 如何自定义自己的自动配置类?)
      • [4.4 Spring Boot的starter依赖是什么?它们的作用是什么?](#4.4 Spring Boot的starter依赖是什么?它们的作用是什么?)
      • [4.5 Spring Boot的自动装配是如何避免冲突的?](#4.5 Spring Boot的自动装配是如何避免冲突的?)
      • [4.6 Spring Boot的自动装配可以禁用吗?如何禁用某个自动配置?](#4.6 Spring Boot的自动装配可以禁用吗?如何禁用某个自动配置?)
    • [5. 小结](#5. 小结)
  • 🐳结语

🐳 Spring Boot自动装配原理详解与常见面试题

1. 前言

Spring Boot作为一个高度简化的Spring框架,通过自动装配机制帮助开发者更轻松地构建和部署Spring应用程序。本篇博客将深入探讨Spring Boot自动装配原理,并通过常见的面试题来加深对该原理的理解。让我们一起来学习和掌握这些知识!


2. Spring Boot自动装配原理

2.1 条件化配置

💧Spring Boot的自动装配原理依赖于条件化配置。条件化配置是通过条件注解实现的,这些注解允许根据应用程序的上下文条件来装配bean。

2.1.1 @ConditionalOnClass

💧注解@ConditionalOnClass用于指定当类路径中存在指定的类时,条件成立,允许装配相应的bean。

💧示例:假设我们有一个RedisService类,它依赖于Jedis客户端库。我们可以使用@ConditionalOnClass来自动配置RedisService

java 复制代码
@Configuration
@ConditionalOnClass(Jedis.class)
public class RedisAutoConfiguration {
    
    @Bean
    public RedisService redisService() {
        return new RedisService();
    }
}

💧在这个例子中,当类路径中存在Jedis类时,RedisAutoConfiguration将被触发,自动配置RedisService

2.1.2 @ConditionalOnBean

💧注解@ConditionalOnBean用于指定当容器中存在指定的bean时,条件成立,允许装配相应的bean。

💧示例:假设我们有一个MongoDBService类,它依赖于MongoClient bean。我们可以使用@ConditionalOnBean来自动配置MongoDBService

java 复制代码
@Configuration
@ConditionalOnBean(MongoClient.class)
public class MongoAutoConfiguration {
    
    @Bean
    public MongoDBService mongoDBService() {
        return new MongoDBService();
    }
}

💧**↑ 当容器中存在MongoClient bean时,MongoAutoConfiguration将被触发,自动配置MongoDBService。**

2.2 组件扫描

💧Spring Boot利用组件扫描机制自动发现带有特定注解的类,并将它们注册为Spring容器中的bean。

2.2.1 示例:自动注册组件

💧假设我们有一个UserService类,带有@Service注解:

java 复制代码
@Service
public class UserService {
    // ...
}

💧在主启动类上加上@SpringBootApplication注解,它将默认扫描主启动类所在包及其子包下的组件:

java 复制代码
@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

💧**↑ UserService将会被自动扫描并注册为Spring容器中的bean。**

2.3 自动配置类

💧Spring Boot的自动配置类是普通的Java配置类,使用条件化配置注解来实现自动装配。

2.3.1 示例:自动配置数据源

💧Spring Boot提供了DataSourceAutoConfiguration类用于自动配置数据源。它使用@ConditionalOnClass注解来判断是否存在DataSource类,然后根据配置文件中的属性来自动配置数据源。

java 复制代码
@Configuration
@ConditionalOnClass(DataSource.class)
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
    
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }
}

💧**↑ 当类路径中存在DataSource类时,DataSourceAutoConfiguration将被触发,并自动配置数据源。**

3. 示例代码

💧为了加深对Spring Boot自动装配原理的理解,这里提供一些示例代码。我们使用Maven构建项目,引入了spring-boot-starter-webspring-boot-starter-data-jpa依赖:

3.1 创建主启动类

java 复制代码
@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

3.2 自定义自动配置类

java 复制代码
@Configuration
@ConditionalOnClass(HelloWorldService.class)
@EnableConfigurationProperties(HelloWorldProperties.class)
public class HelloWorldAutoConfiguration {
    
    @Autowired
    private HelloWorldProperties properties;
    
    @Bean
    public HelloWorldService helloWorldService() {
        return new HelloWorldService(properties.getMessage());
    }
}

3.3 自定义配置属性类

java 复制代码
@ConfigurationProperties(prefix = "myapp.helloworld")
public class HelloWorldProperties {
    
    private String message = "Hello, World!";
    
    // getter and setter methods
}

3.4 使用自定义的HelloWorldService

java 复制代码
@RestController
public class HelloWorldController {
    
    @Autowired
    private HelloWorldService helloWorldService;
    
    @GetMapping("/hello")
    public String hello() {
        return helloWorldService.getMessage();
    }
}

💧在这个例子中,我们定义了一个自定义的HelloWorldService,它可以通过配置属性来设置消息。我们使用了自定义的自动配置类HelloWorldAutoConfiguration来自动配置HelloWorldService,并通过配置属性类HelloWorldProperties来设置消息内容。在HelloWorldController中使用HelloWorldService提供的消息。


4. 常见面试题

4.1 Spring Boot的自动装配原理是什么?

💧答:Spring Boot的自动装配原理是通过条件化配置、组件扫描和自动配置类来实现的。条件化配置允许根据应用程序的上下文条件来装配bean,组件扫描用于自动发现带有特定注解的类并注册为Spring容器中的bean,而自动配置类使用条件化配置来决定是否自动配置特定的bean。

4.2 @ConditionalOnBean和@ConditionalOnClass有什么区别?

💧答@ConditionalOnBean@ConditionalOnClass都是条件化配置注解,但它们的使用场景略有不同。

  • @ConditionalOnBean:用于指定当容器中存在指定的bean时,条件成立,允许装配相应的bean。适用于基于其他bean的存在与否来决定是否配置某个bean。

  • @ConditionalOnClass:用于指定当类路径中存在指定的类时,条件成立,允许装配相应的bean。适用于基于类是否在类路径上来决定是否配置某个bean。

4.3 如何自定义自己的自动配置类?

💧答 :要自定义自己的自动配置类,需要创建一个普通的Java配置类,并在类上使用@Configuration注解。然后,可以使用条件化配置注解(如@ConditionalOnClass@ConditionalOnBean等)来根据条件来决定是否配置bean。

💧示例:自定义一个简单的自动配置类,用于配置一个HelloWorldService:

java 复制代码
@Configuration
public class MyAutoConfiguration {
    
    @Bean
    @ConditionalOnProperty(name = "myapp.enableHelloWorld", havingValue = "true")
    public HelloWorldService helloWorldService() {
        return new HelloWorldService();
    }
}

💧**↑ 当配置属性myapp.enableHelloWorld的值为true时,HelloWorldService将会被自动配置。**

4.4 Spring Boot的starter依赖是什么?它们的作用是什么?

💧答:Spring Boot的starter依赖是一种特殊类型的依赖,它封装了一组相关功能的依赖和自动配置。starter依赖的名称通常以"spring-boot-starter-"开头,例如"spring-boot-starter-web"、"spring-boot-starter-data-jpa"等。它们的作用是简化应用程序的构建和配置,通过引入特定的starter依赖,可以自动配置相应的功能,无需手动配置大量的依赖和bean。

4.5 Spring Boot的自动装配是如何避免冲突的?

💧答 :Spring Boot的自动装配机制通过条件化配置来避免冲突。在自动配置类中使用条件化配置注解,例如@ConditionalOnClass@ConditionalOnBean等,可以根据特定的条件来决定是否自动配置bean。如果某个条件不满足,相应的自动配置将不会生效,从而避免了冲突问题。

4.6 Spring Boot的自动装配可以禁用吗?如何禁用某个自动配置?

💧答 :是的,Spring Boot的自动装配可以通过配置来禁用。可以通过在application.propertiesapplication.yml文件中设置相应的配置属性来禁用自动配置。例如,要禁用某个自动配置类,可以在配置文件中设置spring.autoconfigure.exclude属性:

yaml 复制代码
spring:
  autoconfigure:
    exclude: org.example.MyAutoConfiguration

💧**↑ MyAutoConfiguration自动配置将会被禁用。**


5. 小结

通过本篇博客,我们深入学习了Spring Boot的自动装配原理,包括条件化配置、组件扫描和自动配置类。我们了解了常见的面试题,以及如何自定义自己的自动配置类。通过示例代码,我们对Spring Boot自动装配有了更深入的认识。

希望本篇博客能帮助你更好地理解Spring Boot的自动装配原理,让你在面试和实际开发中更加得心应手。谢谢阅读!~~~


🐳结语

🐬初学一门技术时,总有些许的疑惑,别怕,它们是我们学习路上的点点繁星,帮助我们不断成长。

🐟积少成多,滴水成河。文章粗浅,希望对大家有帮助!

相关推荐
一只叫煤球的猫4 小时前
写代码很6,面试秒变菜鸟?不卖课,面试官视角走心探讨
前端·后端·面试
bobz9654 小时前
tcp/ip 中的多路复用
后端
bobz9654 小时前
tls ingress 简单记录
后端
皮皮林5515 小时前
IDEA 源码阅读利器,你居然还不会?
java·intellij idea
你的人类朋友6 小时前
什么是OpenSSL
后端·安全·程序员
bobz9656 小时前
mcp 直接操作浏览器
后端
前端小张同学8 小时前
服务器部署 gitlab 占用空间太大怎么办,优化思路。
后端
databook8 小时前
Manim实现闪光轨迹特效
后端·python·动效
武子康9 小时前
大数据-98 Spark 从 DStream 到 Structured Streaming:Spark 实时计算的演进
大数据·后端·spark
该用户已不存在9 小时前
6个值得收藏的.NET ORM 框架
前端·后端·.net