在给小伙伴解决一些问题的时候,遇到的这个问题,在 jna 中,windows 和 linux 需要加载的动态链接库的路径不一样。
于是乎,配置文件修改为:
1 2 3 4 5 6 7
| dynamic-lib: windows: xxx-path: D:\develop\xxx yyy-path: D:\develop\yyy linux: xxx-path: /usr/lib/xxx yyy-path: /usr/lib/yyy
|
DynamicLibConfigBase.java
1 2 3 4 5 6 7 8 9 10 11 12 13
| import lombok.Data;
@Data public class DynamicLibConfigBase { private String xxxPath; private String yyyPath; }
|
LinuxDynamicLibConfig.java
1 2 3 4 5 6 7 8 9 10 11 12
| import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration;
@Configuration @Conditional(LinuxCondition.class) // 这里决定了只有在 Linux 中才会创建这个 Bean @ConfigurationProperties(prefix = "dynamic-lib.linux") public class LinuxDynamicLibConfig extends DynamicLibConfigBase { }
|
WindowsDynamicLibConfig.java
1 2 3 4 5 6 7 8 9 10 11 12
| import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration;
@Configuration @Conditional(WindowsCondition.class) // 这里决定了只有在 Windows 中才会创建这个 Bean @ConfigurationProperties(prefix = "dynamic-lib.windows") public class WindowsDynamicLibConfig extends DynamicLibConfigBase { }
|
WindowsConditon.java
1 2 3 4 5 6 7 8 9 10 11 12 13
| import org.springframework.context.annotation.Condition; import org.springframework.context.annotation.ConditionContext; import org.springframework.core.type.AnnotatedTypeMetadata;
public class WindowsCondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { return context.getEnvironment().getProperty("os.name").toLowerCase().contains("windows"); } }
|
LinuxCondition.java
1 2 3 4 5 6 7 8 9 10 11 12 13
| import org.springframework.context.annotation.Condition; import org.springframework.context.annotation.ConditionContext; import org.springframework.core.type.AnnotatedTypeMetadata;
public class LinuxCondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { return context.getEnvironment().getProperty("os.name").toLowerCase().contains("linux"); } }
|
在调用的时候,只要注入 DynamicLibConfigBase 类型的 Bean 就可以直接使用了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class DynamicLibInterfaceTest {
@Autowired private DynamicLibConfigBase dynamicConfig;
@Test void getXxxPath() { System.out.println(dynamicConfig.getXxxPath()); }
@Test void getYyyPath() { System.out.println(dynamicConfig.getYyyPath()); } }
|
在不同的操作系统下就会输出相对应的动态链接库的路径,在新增 动态链接库 的时候,只需要在配置文件中加入在 windows 和 linux 中的不同路径,同时在 DynamicLibConfigBase 中增加对应 Field 就可以了。
总结
- @Condition 决定在什么操作系统下创建哪个 Bean;
- 使用时注入基类即可。