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自动配置原理

1.Condition自动装配?

这边先抛出一个问题

1.1 根据条件加载bean

??下面是根据字节码文件加载,这个代码的作用是如果加载了某个字节码文件,那么就会继续加载其他类。不加载的话也就不会加载和这个相关的方法,非常实用

1.1 自定义自动装配

?上面这个功能在springboot 里面大量使用,下面举几个例子。可以更好的理解Springboot 原理。

下面就是Springboot 自动装配使用到的注解,当然这边提到的还很少,有兴趣的可以自己查查这些注解的功能效用!

下面是Springboot自动装配的redis类

2.切换内置服务器

运用到上面的知识,切换服务器就变的非常的简单易懂!

3.@Enable*系列注解

3.1 @EnableAutoConfiguration

这个底层实际上是@import, 下面就是这个注解的源码

Springboot加载配置类的时候只会加载启动类本包(同级)及其子包的配置类,那么Spring加载的时候也会加载@import 引入的Class类,并且也可以用@CommentScan 包扫描来加载指定路径下的类

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

	/**
	 * Environment property that can be used to override when auto-configuration is
	 * enabled.
	 */
	String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

	/**
	 * Exclude specific auto-configuration classes such that they will never be applied.
	 * @return the classes to exclude
	 */
	Class<?>[] exclude() default {};

	/**
	 * Exclude specific auto-configuration class names such that they will never be
	 * applied.
	 * @return the class names to exclude
	 * @since 1.3.0
	 */
	String[] excludeName() default {};

}

上面图片就是所有自动配置的类,但是不一定都会加载,因为加了判断,情况满足参会加载到容器里面。?

4.@Import注解的四种用法

4.1 导入类

@SpringBootApplication
@Import(User.class)
public class SpringInitApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(SpringInitApplication.class, args);
        User bean = applicationContext.getBean(User.class);
        System.out.println(bean);

    }

}

4.2 导入配置类

首先是配置类的代码

package com.zx.domain;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class UserConfig {
    @Bean
    public User user(){
        return new User();
    }
}

下面是启动类的导入

@SpringBootApplication
//@Import(User.class)
@Import(UserConfig.class)
public class SpringInitApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(SpringInitApplication.class, args);
        User bean = applicationContext.getBean(User.class);
        System.out.println(bean);

    }

}

4.3 导入ImportSelector

首先实现ImportSelector类

package com.zx.domain;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
import java.util.function.Predicate;
public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{
                 //这边是你要导入的对象
                "com.zx.domain.User"
        };
    }
    @Override
    public Predicate<String> getExclusionFilter() {
        return ImportSelector.super.getExclusionFilter();
    }
}

导入的方式还是上面老样子

@Import(MyImportSelector.class)

4.4 ImportBeanDefinitionRegistrar 接口

使用方法

public class MyImportRegister implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        ImportBeanDefinitionRegistrar.super.registerBeanDefinitions(importingClassMetadata, registry);
        registry.registerBeanDefinition("cs",BeanDefinitionBuilder.rootBeanDefinition(User.class).getBeanDefinition());
    }
}

启动类


@SpringBootApplication
//@Import(User.class)
//@Import(UserConfig.class)
@Import(MyImportRegister.class)
public class SpringInitApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(SpringInitApplication.class, args);
        User bean = (User) applicationContext.getBean("cs");
        System.out.println(bean);
    }

}

5. 自定义starter

5.1自动配置类

@Configuration
@EnableConfigurationProperties(UserProperties.class)
public class AutoZx {
     @Bean
     public UserInfo getUserInfo(UserProperties userProperties){
         System.out.println("加载默认用户!");
         return new UserInfo(userProperties.getName());
     }

}

5.2 配置映射

//这边遇到一个问题,无法映射到项目内部的配置文件,只能映射项目外部的配置文件,暂不清楚什么原因
@ConfigurationProperties(prefix = "zx")
public class UserProperties {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

5.3 对象类

public class UserInfo {
    private String name ;

    public UserInfo(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

?5.4 核心扫描配置文件

?

?

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

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 -2025/3/10 17:05:05-

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