Spring Boot 依据配置注入Bean

344 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第25天,点击查看活动详情

Spring Boot 依据配置注入Bean

众所周知Spring可以管理实体bean,以及整个生命周期。定义接口,和实现类spirng可自动将实现类注入接口类引用处,对代码进行解耦。通常业务接口与实现类是一一对应的,但是碰到不同企业,不同上下文时依据配置指定实现接口就比较方便了。

下面介绍两种依据配置注入Bean的方式:

通过@Profile+spring.profiles.active

spring.profiles.active: 官方解释是激活不同环境下的配置文件,但是实际测试发现没有对应的配置文件也是可以正常执行的。那就可以把这个key当作一个标识来使用

@Profile: spring.profiles.active中激活某配置则在spring中托管这个bean,配合@Component,@Service、@Controller、@Repository等使用

上面这些注解都是Spring托管的标识。

  • 示例:

JAVA实体定义

@Component
@Profile("xx")
public class XxxTest extends BaseTest {
    public void test(){
        System.out.println("in XxxTest ");
    }
}
@Component
@Profile("yy")
public class YyyTest extends BaseTest {
    public void test(){
        System.out.println("in YyyTest ");
    }
}

@Service
public class MyService  {

 @Autowired
 private BaseTest  test;

    public void printConsole(){
        test.test();
    }
}
  • 配置文件:
//配置文件激活某个环境则test就会注入哪个bean
spring.profiles.active=xx

上面代码中BaseTest接口有两个实现,依据配置文件来决定具体使用哪个实现,当然没有对应或对应多个实现都会导致异常,这里主要是展示如何通过配置文件切换接口的实现类。

通过@Configuration+@ConditionalOnProperty

@Configuration: 相当于原有的spring.xml,用于配置spring

@ConditionalOnProperty: 依据激活的配置文件中的某个值判断是否托管某个bean,org.springframework.boot.autoconfigure.condition包中包含很多种注解,可以视情况选择

@Configuration
public static class ContextConfig {
@Autowired
private XxxTest xxTest;
@Autowired
private YyyTest yyTest;

@Bean
@ConditionalOnProperty(value = "myTest",havingValue = "xx")
 public BaseTest  xxxTest() {
  return xxTest;
 }

 @Bean
@ConditionalOnProperty(value = "myTest",havingValue = "yy")
 public BaseTest yyyTest() {
  return yyTest;
 }
}
  • 配置文件:
//配置文件中控制激活哪个bean
myTest=xx

这种方式是两个实现都交给Spring管理,给这两个实例取别名,注入接口类时通过Conditional判断使用哪一个实例