使用Spring的Profile注解进行bean切换

利用Spring的配置文件机制,动态切换被注入的Bean。

暂时建立一个适当的spring-boot项目。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>hoge</groupId>
    <artifactId>springbootexpr2</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springbootexpr2</name>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.7.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
</project>

创建一个合适的接口,并创建几个实现类。

public interface ProfileSample {
    String getValue();
}
@Component
@Profile("default")
public class DefaultProfile implements ProfileSample {

    public String getValue() {
        return "default";
    }

}

在中国,可以这样表达:如果未指定个人配置文件(profile),则默认值为default。因此,如果在个人配置文件(profile)注释中指定了这个值,那么当未指定个人配置文件时会使用这个类。

@Component
@Profile("dev")
public class DevProfile implements ProfileSample {

    public String getValue() {
        return "dev";
    }

}
@Component
@Profile("production")
public class ProductionProfile implements ProfileSample {

    public String getValue() {
        return "production";
    }

}

在用于启动的类中进行接口的注入。

@Controller
@EnableAutoConfiguration
@ComponentScan
public class SampleController {

    @Autowired
    ProfileSample sample;

    @RequestMapping("/")
    @ResponseBody
    String home() {
        System.out.println(sample.getValue());
        return "Hello World!";
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(SampleController.class, args);
    }
}

只要在某处指定spring.profiles.active属性,如果未指定,则将使用默认default,就像上面提到的那样。

在命令行参数中指定配置文件的方式如下。

--spring.profiles.active=dev

如果在属性文件中(例如application.yaml)指定的话,可以像这样。

spring.profiles.active: production

顺便提一下,有很多种属性指定的方法,关于这些方法的列表和优先级,请参考 https://docs.spring.io/spring-boot/docs/2.0.0.M4/reference/htmlsingle/#boot-features-external-config

如果只是像这个例子那样的内容,使用接口的默认方法就足够了。

广告
将在 10 秒后关闭
bannerAds