条件注解注入 Bean(Java配置实现)
模拟场景
当程序在 Windows 操作系统下运行时打印 dir
命令,在 Linux 操作系统下运行时打印 ls
命令
代码实现
- 定义接口
ShowCmd.java
public interface ShowCmd {
String show();
}
- 定义接口实现
// ShowCmdInLinux.java
public class ShowCmdInLinux implements ShowCmd {
@Override
public String show() {
return "ls";
}
}
// ShowCmdInWindows.java
public class ShowCmdInWindows implements ShowCmd {
@Override
public String show() {
return "dir";
}
}
- 定义条件
// LinuxCondition.java
public class LinuxCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
String property = conditionContext.getEnvironment().getProperty("os.name");
return property.toLowerCase().contains("linux");
}
}
// WindowsCondition.java
public class WindowsCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
String property = conditionContext.getEnvironment().getProperty("os.name");
return property.toLowerCase().contains("window");
}
}
- 使用条件注解配置Bean
@Configuration
public class JavaConfig {
@Bean("cmd")
@Conditional(WindowsCondition.class)
ShowCmd showCmdInWindows(){
return new ShowCmdInWindows();
}
@Bean("cmd")
@Conditional(LinuxCondition.class)
ShowCmd showCmdInLinux(){
return new ShowCmdInLinux();
}
}
- 应用
public class TestCmd {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(JavaConfig.class);
ShowCmd cmd = (ShowCmd) context.getBean("cmd");
System.out.println(cmd.show());
}
}
网友评论