通过活动的profile,我们可以获得不同的Bean。Spring 4提供了一个更通用的基于条件的Bean的创建,即使用@Conditional注解。
@Conditional根据满足某一个特定条件创建一个特定的Bean。比方说,当某一个jar包在一个类路径下的时候,自动配置一个或多个Bean;或者只有某个Bean被创建才会创建另外一个Bean。总的来说,就是根据特定条件来控制Bean的创建行为,这样我们可以利用这个特性进行一些自动的配置。
在Spring Boot中将会大量应用到条件注解。下面的示例将以不同的操作系统作为条件,我们将通过实现Condition接口,并重写其matches方法来构造判断条件。
若在Windows系统下运行程序,则输出列表命令为dir;
若在Linux操作系统下运行程序,则输出列表命令为ls。
判定Windows的条件。
WindowsCondition.java
package com.shrimpking;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
import java.util.Objects;
/**
* Created by IntelliJ IDEA.
*
* @Author : Shrimpking
* @create 2023/6/8 14:27
*/
public class WindowsCondition implements Condition
{
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata)
{
return Objects.requireNonNull(context.getEnvironment().getProperty("os.name")).contains("Windows");
}
}
判定Linux的条件
LinuxCondition.java
package com.shrimpking;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
/**
* Created by IntelliJ IDEA.
*
* @Author : Shrimpking
* @create 2023/6/8 14:31
*/
public class LinuxCondition implements Condition
{
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata)
{
return context.getEnvironment().getProperty("os.name").contains("Linux");
}
}
不同系统下Bean的类
ListService.java
package com.shrimpking;
/**
* Created by IntelliJ IDEA.
*
* @Author : Shrimpking
* @create 2023/6/8 14:33
*/
public interface ListService
{
public String showCmd();
}
WindowsListService.java
package com.shrimpking;
/**
* Created by IntelliJ IDEA.
*
* @Author : Shrimpking
* @create 2023/6/8 14:34
*/
public class WindowsListService implements ListService
{
@Override
public String showCmd()
{
return "dir";
}
}
LinuxListService.java
package com.shrimpking;
/**
* Created by IntelliJ IDEA.
*
* @Author : Shrimpking
* @create 2023/6/8 14:34
*/
public class LinuxListService implements ListService
{
@Override
public String showCmd()
{
return "ls";
}
}
配置类
ConditionConfig.java
package com.shrimpking;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
/**
* Created by IntelliJ IDEA.
*
* @Author : Shrimpking
* @create 2023/6/8 14:36
*/
@Configuration
public class ConditionConfig
{
@Bean
@Conditional(WindowsCondition.class)
public ListService windowsListService()
{
return new WindowsListService();
}
@Bean
@Conditional(LinuxCondition.class)
public ListService linuxListService()
{
return new LinuxListService();
}
}
代码解释
①通过@Conditional注解,符合Windows条件则实例化windowsListService。
②通过@Conditional注解,符合Linux条件则实例化linuxListService。
运行
package com.shrimpking;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import java.util.concurrent.CopyOnWriteArrayList;
@SpringBootApplication
public class Springboot50ConditionalApplication
{
public static void main(String[] args)
{
//SpringApplication.run(Springboot50ConditionalApplication.class, args);
AnnotationConfigApplicationContext context
= new AnnotationConfigApplicationContext(ConditionConfig.class);
ListService listService = context.getBean(ListService.class);
String temp = context.getEnvironment().getProperty("os.name");
System.out.println(temp + "系统下的列表命令为:" + listService.showCmd());
context.close();
}
}