1. 程式人生 > >spring boot: 條件註解@Condition

spring boot: 條件註解@Condition

.sh 列表 一個 condition cati name property sta 輸出

@Conditional根據滿足某一個特定的條件創建一個特定的Bean(基於條件的Bean的創建,即使用@Conditional註解)。

比方說,當一個jar包在一個類的路徑下的時候,自動配置一個或多個Bean,或者只有某個Bean被創建才會去創建另外一個Bean。

通過實現Condition接口,並重寫期matches方法來構造判斷條件。若在windows系統洗運行程序,則輸出列表命令dir,若在linux操作系統下運行程序,則輸出命令為:ls.

1.判斷條件定義

判斷windows的條件

 1 package ch2.conditional2;
 2 
 3 //條件註解,並復寫此類
 4 import org.springframework.context.annotation.Condition;
5 //條件註解容器 6 import org.springframework.context.annotation.ConditionContext; 7 import org.springframework.core.type.AnnotatedTypeMetadata; 8 9 public class LinuxCondition implements Condition { 10 11 @Override 12 public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
13 // TODO Auto-generated method stub 14 return context.getEnvironment().getProperty("os.name").contains("Linux"); 15 } 16 17 }

判定linux的條件

 1 package ch2.conditional2;
 2 
 3 //條件註解接口類,復寫metches
 4 import org.springframework.context.annotation.Condition;
 5 import org.springframework.context.annotation.ConditionContext;
6 import org.springframework.core.type.AnnotatedTypeMetadata; 7 8 public class WindowsCondition implements Condition { 9 10 @Override 11 public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { 12 // TODO Auto-generated method stub 13 return context.getEnvironment().getProperty("os.name").contains("Windows"); 14 } 15 16 }

2不同系統下的Bean類

1接口

1 package ch2.conditional2;
2 
3 public interface ListService {
4 
5     public String showListCmd();
6 }

2windows下要創建的Bean類

 1 package ch2.conditional2;
 2 
 3 import ch2.conditional2.ListService;
 4 
 5 public class WindowsListService implements ListService {
 6 
 7     @Override
 8     public String showListCmd() {
 9         // TODO Auto-generated method stub
10         return "dir";
11     }
12 
13 }

3linux下要創建的Bean類

 1 package ch2.conditional2;
 2 
 3 import ch2.conditional2.ListService;
 4 
 5 public class LinuxListService implements ListService {
 6 
 7     @Override
 8     public String showListCmd() {
 9         // TODO Auto-generated method stub
10         return "ls";
11     }
12 
13 }

3配置類

package ch2.conditional2;

//配置類聲明
import org.springframework.context.annotation.Configuration;
//bean聲明
import org.springframework.context.annotation.Bean;
//條件限制
import org.springframework.context.annotation.Conditional;

//聲明為配置類
@Configuration
public class ConditionConfig {

    //註解為Bean
    @Bean
    //註解條件判斷
    @Conditional(WindowsCondition.class)
    public ListService windowsListService()
    {
        return new WindowsListService();
    }
    
    //註解為Bean
    @Bean
    //註解條件判斷
    @Conditional(LinuxCondition.class)
    public ListService linuxListService()
    {
        return new LinuxListService();
    }
}

4運行

package ch2.conditional2;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {

    public static void main(String[] args)
    {
        
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConditionConfig.class);
        ListService listService = context.getBean(ListService.class);
        System.out.println( 
                context.getEnvironment().getProperty("os.name") +
                "系統的查看目錄的命令是: " +
                listService.showListCmd()
                );
        context.close();
    }
}

運行結果:Windows 10系統的查看目錄的命令是: dir

spring boot: 條件註解@Condition