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

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

【Spring Boot自动装配原理详解与常见面试题】—— 每天一点小知识(上):https://developer.aliyun.com/article/1390114?spm=a2c6h.13148508.setting.32.4fea4f0ervlqra

3. 示例代码

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

3.1 创建主启动类

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

3.2 自定义自动配置类

@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 自定义配置属性类

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

3.4 使用自定义的HelloWorldService

@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:

@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属性:

spring:
  autoconfigure:
    exclude: org.example.MyAutoConfiguration

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


5. 小结

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

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

相关文章
|
8月前
|
缓存 Java 开发者
【Spring】原理:Bean的作用域与生命周期
本文将围绕 Spring Bean 的作用域与生命周期展开深度剖析,系统梳理作用域的类型与应用场景、生命周期的关键阶段与扩展点,并结合实际案例揭示其底层实现原理,为开发者提供从理论到实践的完整指导。
1005 22
|
8月前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
2782 0
|
7月前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
7月前
|
JavaScript Java Maven
【SpringBoot(二)】带你认识Yaml配置文件类型、SpringMVC的资源访问路径 和 静态资源配置的原理!
SpringBoot专栏第二章,从本章开始正式进入SpringBoot的WEB阶段开发,本章先带你认识yaml配置文件和资源的路径配置原理,以方便在后面的文章中打下基础
599 4
|
7月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
730 2
|
9月前
|
Java 关系型数据库 数据库
深度剖析【Spring】事务:万字详解,彻底掌握传播机制与事务原理
在Java开发中,Spring框架通过事务管理机制,帮我们轻松实现了这种“承诺”。它不仅封装了底层复杂的事务控制逻辑(比如手动开启、提交、回滚事务),还提供了灵活的配置方式,让开发者能专注于业务逻辑,而不用纠结于事务细节。
1167 1
|
10月前
|
缓存 安全 Java
Spring 框架核心原理与实践解析
本文详解 Spring 框架核心知识,包括 IOC(容器管理对象)与 DI(容器注入依赖),以及通过注解(如 @Service、@Autowired)声明 Bean 和注入依赖的方式。阐述了 Bean 的线程安全(默认单例可能有安全问题,需业务避免共享状态或设为 prototype)、作用域(@Scope 注解,常用 singleton、prototype 等)及完整生命周期(实例化、依赖注入、初始化、销毁等步骤)。 解析了循环依赖的解决机制(三级缓存)、AOP 的概念(公共逻辑抽为切面)、底层动态代理(JDK 与 Cglib 的区别)及项目应用(如日志记录)。介绍了事务的实现(基于 AOP
398 0
|
10月前
|
监控 架构师 NoSQL
spring 状态机 的使用 + 原理 + 源码学习 (图解+秒懂+史上最全)
spring 状态机 的使用 + 原理 + 源码学习 (图解+秒懂+史上最全)
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?