Spring基於配置方式實現自定義條件裝配

@Profile

  • Spring爲我們提供的可以根據當前環境,動態的激活和切換一系列組件的功能

  • @Profile指定組件在哪個環境的情況下才能被註冊到容器中,不指定,任何環境下都能註冊這個組件

  • @Profile註解可以加在類上,也可以加載注入bean的方法上

  • @Profile註解用於實現通過修改運行時參數,切換不同的開發環境

下面模擬一下在不同環境下加載不同類的場景

我們有一個計算多個整數的方法的類

public interface CalculateService {
    /**
     * sum求和(多個整數)
     *
     * @param values
     * @return 累計值
     */
    Integer sum(Integer... values);
}

環境爲Java7時的實現

@Service
@Profile("Java7")
public class Java7CalcalateService implements CalculateService {
    @Override
    public Integer sum(Integer... values) {
        System.out.println("java7 for循環實現");
​
        Integer sum = 0;
        for (Integer value : values) {
            sum += value;
        }
        return sum;
    }
}

環境爲Java8時的實現

@Service
@Profile("Java8")
public class Java8CalculateService implements CalculateService {
    @Override
    public Integer sum(Integer... values) {
        System.out.println("java8 lambda實現");
        int sum = Stream.of(values).reduce(0, Integer::sum);
        return sum;
    }
}

測試

@SpringBootApplication
public class Study01Application {
​
    public static void main(String[] args) {
        ConfigurableApplicationContext context = new SpringApplicationBuilder(Study01Application.class)
                .web(WebApplicationType.NONE)
                .profiles("Java7")
                .run(args);
​
        CalculateService calculateService = context.getBean(CalculateService.class);
        System.out.println(calculateService.sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
    }
​
}

通過指定不同的環境,可以發現控制檯打印對應版本的Service

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