2024-03-20
目录
Spring的装配、注入和Import注解和SPI的实现
装配
将bean对象注册到spring容器中的过程
自动装配 @EnableAutoConfiguration
springboot项目自动装配的入口,读取扫描的包和类的注解信息配置
条件装配
- @ConditionalOnClass 当类路径中存在特定的类时才会生效,用于检查类路径是否包含指定的类。
- @ConditionalOnMissingClass 当类路径中缺少特定类时才会生效,用于检查类路径是否不包含指定的类。
- @ConditionalOnBean 当容器中存在特定的 bean 时才会生效。
- @ConditionalOnMissingBean 当容器中缺少特定的 bean 时才会生效。
- @ConditionalOnProperty 根据指定的属性是否存在以及其值是否符合条件来判断是否生效。
自动配置 @Configuration
@Configuration (@Configuration 修饰在类上,@Bean 修饰在方法上)
运行时属性
项目启动的时候,读取配置文件中的配置项,完成类的配置 (serrver.port )
@PropertySource和@Value 注解不一定要放在spring的bean中,但是放在spring的bean中的话其他类读取更方便
注入
将bean的依赖关系或其他资源传递给目标对象
Import注解
自动导入装配组件
@Configuration
public class AppConfig1 {
@Bean
public MyService1 myService1() {
return new MyService1Impl();
}
// 其他的 @Bean 方法和配置
}
@Configuration
public class AppConfig2 {
@Bean
public MyService2 myService2() {
return new MyService2Impl();
}
// 其他的 @Bean 方法和配置
}
主配置类
@Configuration
@Import({AppConfig1.class, AppConfig2.class})
public class MainAppConfig {
// 这里不需要额外的配置,因为 AppConfig1 和 AppConfig2 已经被导入
}
@Import 的意义在于提供一个明确的、声明性的方式来组合配置,尽管AppConfig1.class, AppConfig2.class 不需要@Import也能被注入到spring容器中
导入外部类
通过@Import注解的方式,导入外部的类使其被spring管理,该外部的类之前没有被spring管理
SPI的实现
用来设计给服务提供商做插件(就是被人提供了一个jar包,里面的关键类是用接口实现的)使用的。
基于策略模式来实现动态加载的机制。我们在程序只定义一个接口,具体的实现交个不同的服务提供者;在程序启动的时候,读取配置文件,由配置确定要调用哪一个实现。
服务使用者的自定义实现
//在 META-INF/services 目录下的配置文件分行列出每个实现类的全限定名,每行一个实现类的全限定名
META-INF/services/com.example.MyService
com.example.MyServiceImpl1
com.example.MyServiceImpl2
服务提供商的代码实现
ServiceLoader`<MyService>` loader = ServiceLoader.load(MyService.class);
for (MyService service : loader) {
service.doSomething(); // 调用服务提供者的方法
}
标题:Spring的装配、注入和Import注解和SPI的实现
作者:temp12138
地址:https://solo.mfyzl.icu/articles/2024/03/19/1710863873340.html
废话短说