Solo  当前访客:1 开始使用


Spring的装配、注入和Import注解和SPI的实现

装配

将bean对象注册到spring容器中的过程

自动装配 @EnableAutoConfiguration

springboot项目自动装配的入口,读取扫描的包和类的注解信息配置

条件装配
  1. @ConditionalOnClass 当类路径中存在特定的类时才会生效,用于检查类路径是否包含指定的类。
  2. @ConditionalOnMissingClass 当类路径中缺少特定类时才会生效,用于检查类路径是否不包含指定的类。
  3. @ConditionalOnBean 当容器中存在特定的 bean 时才会生效。
  4. @ConditionalOnMissingBean 当容器中缺少特定的 bean 时才会生效。
  5. @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

标签:
新一篇: 千万级数据分页查询优化 旧一篇: Spring bean的后置处理器