一文搞懂SpringBoot自动装配原理

@Configuration注解

@Configuration 注解用于标识一个类为配置类。
@Configuration 注解告诉Spring容器,这个类包含一个或多个用 @Bean 注解标记的方法,这些方法将返回由Spring管理的Bean实例。

@Configuration
public class AppConfig {

    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }

    @Bean
    public MyRepository myRepository() {
        return new MyRepositoryImpl();
    }
}

@AutoConfiguration注解

@AutoConfiguration 注解用于标识一个类为自动配置类。
这个注解一般是在被引入的jar包中用的,比如我们想引一个starter组件,想在引入的时候spring就能自动注入相关的bean对象
在被引入的jar包中,就需要@AutoConfiguration 注解,并在resources下的META-INF/spring下的org.springframework.boot.autoconfigure.AutoConfiguration.imports(spring boot 2.7版本引入,以前是META-INF/spring.factories)文件中写入要自动配置的类的全类名

实际上,对于手动配置来说,不加@Configuration不会影响@Bean的操作
对于自动配置来说,不加@AutoConfiguration和@Bean,只要在imports文件中写了全类名,也不影响bean的注入

@Import 注解

1. 一般用于导入哪些类?

  1. 配置类(通常是用@Configuration注解标记的类)
  2. 组件类(用@Component、@Service、@Repository等注解标记的类)
  3. 导入自定义的ImportSelectorImportBeanDefinitionRegistrar实现

2. 使用场景?

  1. 如果要注册的bean对象来自于第三方(不是自定义的),是无法用 @Component 及衍生注解声明bean的,可以用@Import 注解导入配置类
  2. 在大型项目中,通常会将配置分散到多个模块中。@Import注解可以帮助你将这些模块化的配置类集中到一个主配置类中。意思就是模块A中需要的配置类可能是由模块B实现的,这个时候模块A的启动类是扫描不到B的配置类的,可以用@Import注解导入进A模块

3. 基本使用

@Configuration
public class DatabaseConfig {
    @Bean
    public DataSource dataSource() {
        // 配置数据源
        return new DataSource();
    }
}

@Configuration
@Import(DatabaseConfig.class)
public class AppConfig {
    // 其他配置
}
@Configuration
@Import({DatabaseConfig.class, SecurityConfig.class, UserService.class})
public class AppConfig {
    // 其他配置
}

ImportSelector 接口

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

public class MyImportSelector implements ImportSelector {

    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        // 根据条件动态选择要导入的配置类
        if (someCondition) {
            return new String[]{"com.example.ConfigA"};
        } else {
            return new String[]{"com.example.ConfigB"};
        }
    }


}
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import(MyImportSelector.class)
public class AppConfig {
}

Spring 在解析和加载 @Configuration 类时,会检测到 @Import 注解,并调用与之关联的 ImportSelector 实现类。在这个过程中,Spring 会将当前 @Configuration 类的元数据封装成 AnnotationMetadata 对象,并传递给 ImportSelector 的 selectImports 方法。

自动配置原理

内容来自黑马:https://www.bilibili.com/video/BV14z4y1N7pg
在这里插入图片描述

在主启动类上添加了@SpringBootApplication注解,这个注解组合了@EnableAutoConfiguration注解,@EnableAutoConfiguration注解又组合了@Import注解,导入了AutoConfigurationImportSelector类,实现selectImports方法,这个方法经过层层调用,最终会读取META-INF目录下的后缀名为imports的文件,boot2.7以前的版本,读取的是spring.factories文件,读取到全类名了之后,会解析注册条件,也就是@Conditional及其衍生注解,把满足注册条件的Bean对象自动注入到IOC容器中。

如何自定义starter

  1. 使用@AutoConfiguration@Bean定义要自动配置的类和bean
  2. META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports中写上自动配置类的全类名
  3. 打包发布,在其他项目中引入即可
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值