Spring Boot自动配置

Spring Boot自动配置


前言

 SpringBoot的自动配置就是当Spring容器启动后,一些配置类,bean对象等就自动存入到了IoC容器中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置操作。SpringBoot自动配置,就是指SpringBoot是如何将依赖 jar 包中的配置类以及Bean加载到Spring IoC容器中的。

Spring 加载Bean

 Spring通过五大注解和 @Bean 注解可以帮助我们把Bean加载到Spring IoC容器中,以上有个前提就是这些注解类需要和SpringBoot启动类在同一目录下 ( @SpringBootApplication 标注的类 就是SpringBoot项目的启动类)。

 需要指定路径或者引入的文件,告诉Spring让其进行扫描到。常见的解决方案有两种:

  • @ComponentScan 组件扫描
  • @Import 导入(使用@Import导入的类会被Spring加载到IoC容器中)

@ComponentScan

java 复制代码
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@ComponentScan("com.bite.autoconfig")
@SpringBootApplication
public class SpringAutoconfigApplication {

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

 也可以指定扫描多个包,

java 复制代码
@ComponentScan({"com.bite.autoconfig","com.example.demo"})

@Import

 @Import 导入可以包括:导入类或导入 ImportSelector 接口实现类。

 直接导入类告诉Spring加载 biteConfig

java 复制代码
@Import(BiteConfig.class)
@SpringBootApplication
public class SpringAutoconfigApplication {

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

}

 也可以导入多个类

java 复制代码
@Import({BiteConfig.class, BiteConfig2.class})

ImportSelector 接口实现类

java 复制代码
public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        //需要导入的全限定类名
        return new String[]
            {"com.bite.autoconfig.BiteConfig","com.bite.autoconfig.BiteConfig2"};
    }
}
java 复制代码
@Import(MyImportSelector.class)
@SpringBootApplication
public class SpringAutoconfigApplication {

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

}

 但是对于上面的方法来说,使用者需要知道第三⽅依赖中有哪些Bean对象或配置类。如果漏掉其中⼀些Bean,很可能导致我们的项醒目出现大的事故

SpringBoot原理分析

 对于SpringBoot来说,第三方依赖可以提供⼀个注解,注解中指定要导入哪些类,在启动类上适用第三方提供的注解。@SpringBootApplication 标注的类就是SpringBoot项目的启动类,

java 复制代码
@SpringBootApplication
public class SpringIocApplication {

    public static void main(String[] args) {
        //获取Spring上下文对象
        ApplicationContext context = 
            SpringApplication.run(SpringIocApplication.class, args);
        //从Spring上下文中获取对象
        BeanLifeComponent beanLifeComponent = 
            context.getBean(BeanLifeComponent.class);
        beanLifeComponent.use();
    }
}

 其源码如下,其中@Target、@Retention、@Documented、@Inherited都是JDK的元注解;

  • @SpringBootConfiguration是对@Configuration的一个包装,标注当前类为配置类;
  • @EnableAutoConfiguration用来进行自动配置,包含核心内容为:
    • @Import 注解读取当前项目下所有依赖jar包中 META-INF/spring.factories,META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 两个文件里面定义的配置类(配置类中定义了 @Bean 注解标识的方法);
    • @AutoConfigurationPackage:把启动类所在的包下面所有的组件都注入到 Spring 容器中;
  • @ComponentScan进行包扫描(默认扫描的是启动类所在的当前包及其子包)。
java 复制代码
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
        type = FilterType.CUSTOM,
        classes = {TypeExcludeFilter.class}
    ), @Filter(
        type = FilterType.CUSTOM,
        classes = {AutoConfigurationExcludeFilter.class}
    )}
)
public @interface SpringBootApplication {
    //...代码省略
}
相关推荐
光锥智能1 分钟前
海康机器人举行2026移动机器人新品发布会:箱式存拣升级,「明智」系列发布
java·前端·机器人
行思理14 分钟前
Nginx 跨站请求(CORS)配置完全指南:从原理到生产实践
java·前端·nginx
小溪学编程22 分钟前
Spring @Bean 与 @Component 注解的区别详解
java·后端·spring
IT_陈寒1 小时前
Python的列表推导式用不好真的会爆内存你知道吗
前端·人工智能·后端
Wang's Blog1 小时前
Java 项目实战: 交友项目 - 圈子互动章总结与自检清单
java·bootstrap·交友
xyouyuweizhu1 小时前
字节流与字符流:Java IO 的两条主线该怎么选
java·开发语言·python
代码方舟2 小时前
零信任架构实战:基于天远人企关联构建自动化供应链核心企业关联穿透与利益冲突审查网关
java·人工智能·架构·自动化
摸爬滚打的小李2 小时前
TomCat
后端
liyi_hz20082 小时前
O2OA(翱途) V10.1 即将发布|功能再升级,安全再加固,协同更高效!
java·javascript·windows·开源软件
骑着蜗牛撵大象3272 小时前
AI Agent 工程化开发实战(三):用 StateGraph 给智能体搭一条可回放的状态流水线
java·开发语言·jvm·ai·状态管理·langgraph·stategraph