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自动装配原理(学习笔记) -> 正文阅读

[Java知识库]SpringBoot自动装配原理(学习笔记)

SpringBoot自动装配原理(学习笔记)

原理总结一句话就是:通过@EnableAutoConfiguration注解加载Springboot内置的自动初始化类(加载什么类是配置在Spring.factories),在这些类中基于spring4.0提供的Condition接口进行Bean的初始化。

大致流程

从启动类的注解@SpringBootApplication中,除元注解以外最关键的注解是:@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan。通过@EnableAutoConfiguration注解里面关键的是这个@Import(AutoConfigurationImportSelector.class)这个注解,导入了一个AutoConfigurationImportSelector类。此类的作用就是扫描MATA-INFO/Spring.factories,以EnableAutoConfiguration下面的类的全路径,再 结合@Condition注解来判断是否注入该类。

@Conditional(条件判断)

介绍@Conditional注解

  • 作用:条件判断

  • 使用:

    • 可以写在类上或者方法上

    • 参数是一个Class数组但传入的参数需要是Condition的实现类

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
    Class<? extends Condition>[] value();
}

案例

需求:

  • 创建一个配置类
  • 编写一个方法,方法的返回值是User对象
  • 在方法上使用@Condition注解,如果有redis则创建,没有redis则不创建

实现

  • 创建一个配置类,并创建一个方法根据@Conditional注解,判断是否注入到Ioc容器中

    //声明这是一个配置类
    @Configuration
    public class ConditionTest {
        
        /**
         * @Bean  //将这个ben放入到ioc容器中
         * @Conditional //判断这个ConditionRedis返回值是false还是true,如果是tue则会注入到ioc容器中,如果是false则不会注入到ioc容器中
         * @return 返回User对象
         */
        @Bean
        @Conditional(ConditionRedis.class)
        public User getUser(){
            return new User();
        }
    }
    
  • 创建一个Condition的实现类

    //创建一个配置类,实现Condition接口
    public class ConditionRedis implements Condition {
          //重写matches方法  返回值是false还是true,如果是tue则会注入到ioc容器中,如果是false则不会注入到ioc容器中
        @Override
        public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
            boolean flag=false;
            try {
                //判断RedisTemplate是否导入了这个类
                Class<?> aClass = Class.forName("org.springframework.data.redis.core.RedisTemplate");
                //如果执行到这里说明是导入了
                flag=true;
            } catch (ClassNotFoundException e) {
                //如果出现异常说明是没有导入这个类
                e.printStackTrace();
            }
            return flag;
        }
    }
    
  • 导入redis的依赖

    <!--配置redis-->
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-data-redis</artifactId>
    		</dependency>
    
  • Springboot入口类测试

@SpringBootApplication
public class SpringBootCondition {
    public static void main(String[] args) {
        //得到ioc容器
        ConfigurableApplicationContext run = SpringApplication.run(SpringBootCondition.class, args);
        //从ioc容器中找User这个Bean
        User bean = run.getBean(User.class);
        //打印
        System.out.println(bean);
    }
}

效果
没有导入导入了redis依赖
在这里插入图片描述
导入了redis依赖
在这里插入图片描述

EnableAutoConfiguration原理

  • 主要的注解是@EnableAutoConfiguration
  • @EnableAutoConfiguration注解上面又使用了@Import({AutoConfigurationImportSelector.class})注解,映入了AutoConfigurationImportSelector类
    • AutoConfigurationImportSelector类中调用了selectImports类
      在这里插入图片描述
  • selectImports调用了
    源码注解
    根据导入的@Configuration类的AnnotationMetadata返回AutoConfigurationImportSelector.AutoConfigurationEntry 。
    参数:
    annotationMetadata – 配置类的注解元数据
    返回:
    应该导入的自动配置
    在这里插入图片描述
  • 调用了getCandateConfigurations()方法
    在这里插入图片描述
  • 读取配置文件
    在这里插入图片描述
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-11-09 19:20:29  更:2021-11-09 19:20:39 
 
开发: 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/24 0:32:47-

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