IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SpringBoot自动配置之@EnableAutoConfiguration注解 -> 正文阅读

[Java知识库]SpringBoot自动配置之@EnableAutoConfiguration注解

SpringBoot自动配置之@EnableAutoConfiguration注解

前言

你有想过SpringBoot为什么能够自动的帮我们创建一个Bean对象么?或许在我们使用的时候只需要在自己自定义的配置文件中加入@Bean对象就可以,但SpringBoot是如何来创建的呢。

@EnableAutoConfiguration注解

其实SpringBoot自动配置的原理主要是用的这个@EnableAutoConfiguration注解,其原理为以下三点:
(1)在@EnableAutoConfiguration注解内部使用@Import(AutoConfigurationImportSelector.class)来加载配置类;
(2)配置文件位置:META-INF/spring.factories,该配置文件中定义了大量的配置类,当SpringBoot项目启动时,会自动加载这些配置类,初始化Bean;
(3)并不是所有的Bean都会被初始化,在配置类文件中使用Condition来加载满足条件的Bean。

一个简单的案例

上面的原理看上去还是不太好理解的,这个需要查看源码结合理解,接下来我就就一个简单的例子来解释一下。
一个简单的需求:让SpringBoot自动帮我们创建一个User和Role的Bean对象。
第一步,自定义配置类

package cs.yangtze.springboot_enable_other.config;

import cs.yangtze.springboot_enable_other.entity.Role;
import cs.yangtze.springboot_enable_other.entity.User;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Version 1.0
 * @Author:cyl
 * @Date:2022/8/10
 * @Content:
 */
@Configuration
public class UserConfig {

    @Bean
    @ConditionalOnProperty(name = "lxr",havingValue = "20")
    public User user(){
        return new User();
    }

    @Bean
    public Role role(){
        return new Role();
    }
}

第二步,ImportSelector实现类来加载自定义的配置类,这就对应原理的(1)

package cs.yangtze.springboot_enable_other.config;

import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

/**
 * @Version 1.0
 * @Author:cyl
 * @Date:2022/8/12
 * @Content:
 */
public class MyImportSelect implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
{"cs.yangtze.springboot_enable_other.config.UserConfig"};
    }
}

原理(2)中配置文件位置是这样的,但我们自己自定义的配置文件位置不一样,当SpringBoot项目启动时,会自动加载配置类,初始化Bean

@Import(MyImportSelect.class)
@SpringBootApplication
public class SpringbootEnableApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(SpringbootEnableApplication.class, args);
        Role role =context.getBean(Role.class);
        System.out.println(role);

        User user = context.getBean(User.class);
        System.out.println(user);
    }
}

这时候我们来看一下控制台打印结果:
在这里插入图片描述我们会发现,Role的Bean对象正常打印了,但是User的并没有,这是为什么?
这时候就对应原理(3),并不是所有的Bean都会被初始化,因为我在自定义的UserConfig配置类中,在User上加上了@ConditionalOnProperty(name = “lxr”,havingValue = “20”)条件注解,只有当我的配置文件application.properties中有这个键值对时才能够创建User对象。
在这里插入图片描述最终也是得到正确结果

总结

SpringBoot自动配置的原理就是以上三点,我举的例子应该能够很好地帮助你理解,如果有什么不对的地方还请大家批评指正,这也是我看了几遍视频后的理解。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-08-19 18:50:24  更:2022-08-19 18:51:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:13:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码