文章目录
@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. 一般用于导入哪些类?
- 配置类(通常是用@Configuration注解标记的类)
- 组件类(用@Component、@Service、@Repository等注解标记的类)
- 导入自定义的
ImportSelector或ImportBeanDefinitionRegistrar实现
2. 使用场景?
- 如果要注册的bean对象来自于第三方(不是自定义的),是无法用 @Component 及衍生注解声明bean的,可以用@Import 注解导入配置类
- 在大型项目中,通常会将配置分散到多个模块中。@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
- 使用
@AutoConfiguration和@Bean定义要自动配置的类和bean - 在
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports中写上自动配置类的全类名 - 打包发布,在其他项目中引入即可
1299

被折叠的 条评论
为什么被折叠?



