spring SPI 實現方式

方式1:引入某個jar 包就能自動初始化某些bean

1.需要在resource/META-INF 下創建一個 名爲 spring.factories 的文件,並指定配置類型如

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    org.activiti.spring.boot.EagleScheduleAutoConfigure,\
    org.activiti.spring.boot.EndpointAutoConfiguration,\
    org.activiti.spring.boot.RestApiAutoConfiguration,\
    org.activiti.spring.boot.JpaProcessEngineAutoConfiguration,\
    org.activiti.spring.boot.SecurityAutoConfiguration

EagleScheduleAutoConfigure

@Configuration
@ComponentScan
@EnableScheduling
public class EagleScheduleAutoConfigure {

}

方式2:引入jar 包後,使用註解開啓如 @Enablexxx

自定義註解如 @EnableSomeBeans 在其中使用@Import 引用配置如:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import(SomeBeanConfiguration.class)
@interface EnableSomeBeans {}
@Configuration
class SomeBeanConfiguration {
 
    @Bean
    public String aBean1() {
        return "aBean1";
    }
 
    @Bean
    public String aBean2() {
        return "aBean2";
    }
}

帶Selector的Enable註解

當然,Enable註解可以更加複雜,可以根據所在上下文來激活不同類型的bean。比如:EnableCaching,可以根據類路徑上的不同實現來激活對應的緩存。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import(SomeBeanConfigurationSelector.class)
public @interface EnableSomeBeansSelector {
   String criteria() default "default";
}
mport org.springframework.context.annotation.ImportSelector;
import org.springframework.core.annotation.AnnotationAttributes;
import org.springframework.core.type.AnnotationMetadata;
 
public class SomeBeanConfigurationSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        AnnotationAttributes attributes =
                AnnotationAttributes.fromMap(
                        importingClassMetadata.getAnnotationAttributes(EnableSomeBeansSelector.class.getName(), false));
        String criteria = attributes.getString("criteria");
        if (criteria.equals("default")) {
            return new String[]{"enableannot.selector.SomeBeanConfigurationDefault"};
        }else {
            return new String[]{"enableannot.selector.SomeBeanConfigurationType1"};
        }
    }
}
 
@Configuration
class SomeBeanConfigurationType1 {
 
    @Bean
    public String aBean() {
        return "Type1";
    }
 
}
 
@Configuration
class SomeBeanConfigurationDefault {
 
    @Bean
    public String aBean() {
        return "Default";
    }
 
}

可能常用到的註解

  • @EnableConfigurationProperties(DemoProperties.class)
  • @ConfigurationProperties(prefix = "demo")
  • @ComponentScan( basePackages = {"springfox.documentation.swagger2.mappers"} )
  • @ComponentScans
  • @Import({SpringfoxWebMvcConfiguration.class, SwaggerCommonConfiguration.class})
  • @AutoConfigureBefore(DataSourceAutoConfiguration.class)
  • @AutoConfigureAfter({ HttpMessageConvertersAutoConfiguration.class, JacksonAutoConfiguration.class })
  • @ConditionalOnProperty( prefix = "demo", name = "isopen", havingValue = "true" )
  • @ConditionalOnClass(DruidDataSource.class)
  • @ConditionalOnWebApplication
  • @ConditionalOnMissingBean
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章