【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的自动装配原理,让你在面试和实际开发中更加得心应手。谢谢阅读!~~~


🐳结语

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

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

相关推荐
2401_8576100312 分钟前
Spring Boot框架:电商系统的技术优势
java·spring boot·后端
LuckyLay27 分钟前
Spring学习笔记_34——@Controller
spring·controller
希忘auto28 分钟前
详解MySQL安装
java·mysql
冰淇淋烤布蕾40 分钟前
EasyExcel使用
java·开发语言·excel
拾荒的小海螺1 小时前
JAVA:探索 EasyExcel 的技术指南
java·开发语言
Jakarta EE1 小时前
正确使用primefaces的process和update
java·primefaces·jakarta ee
马剑威(威哥爱编程)1 小时前
哇喔!20种单例模式的实现与变异总结
java·开发语言·单例模式
java—大象1 小时前
基于java+springboot+layui的流浪动物交流信息平台设计实现
java·开发语言·spring boot·layui·课程设计
ApiHug2 小时前
ApiSmart x Qwen2.5-Coder 开源旗舰编程模型媲美 GPT-4o, ApiSmart 实测!
人工智能·spring boot·spring·ai编程·apihug
魔道不误砍柴功2 小时前
探秘Spring Boot中的@Conditional注解
数据库·spring boot·oracle