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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章