如何在 Java 中的抽象 class(均存在于库中)中注入特定实现?
How to inject a particular implementation in an abstract class (both present inside a library) in Java?
我创建了一个简单的 Java - Maven 库,它有一个抽象 class A 及其两个实现 A1 和 A2。其他项目将使用这个库。
我想知道其他项目可以用最少的代码指定哪个实现应该用于抽象 class 的各种方式。
目前,我正在通过以下方式在其他项目中测试该库:
A a = new A1();
a.func();
但这是紧耦合,如果有人想更改实现,则需要修改 class。
一种常见的方法是在一些配置中进行 class
@Configuration
public class MyConfig {
@Bean public void myBean () {
return new A1();
// return new A2();
}
}
您可以在 myBean 方法中执行任何您想要的逻辑 (if...else) 来确定要实例化哪一个。
更好的方法是使用条件语句。以@ConditionalOnProperty 为例,它决定应用程序配置中给定值的存在。
更一般的,你可以看看@Conditional 和相关的注解。您可以检查 class 路径中是否存在给定的 class、是否加载了给定的 bean、环境变量、应用程序配置、组合多个条件等等。
许多配置 class 像这样带有条件的配置存在于 Spring 自身内部,所以您不必为简单的情况配置任何东西。
我创建了一个简单的 Java - Maven 库,它有一个抽象 class A 及其两个实现 A1 和 A2。其他项目将使用这个库。 我想知道其他项目可以用最少的代码指定哪个实现应该用于抽象 class 的各种方式。
目前,我正在通过以下方式在其他项目中测试该库:
A a = new A1();
a.func();
但这是紧耦合,如果有人想更改实现,则需要修改 class。
一种常见的方法是在一些配置中进行 class
@Configuration
public class MyConfig {
@Bean public void myBean () {
return new A1();
// return new A2();
}
}
您可以在 myBean 方法中执行任何您想要的逻辑 (if...else) 来确定要实例化哪一个。
更好的方法是使用条件语句。以@ConditionalOnProperty 为例,它决定应用程序配置中给定值的存在。 更一般的,你可以看看@Conditional 和相关的注解。您可以检查 class 路径中是否存在给定的 class、是否加载了给定的 bean、环境变量、应用程序配置、组合多个条件等等。
许多配置 class 像这样带有条件的配置存在于 Spring 自身内部,所以您不必为简单的情况配置任何东西。