Что вам нужно, так это реализация механизма внедрения зависимостей .
Вы можете сделать это самостоятельно, но я бы посоветовал вам использовать существующую библиотеку DI, например EasyDI
Пожалуйста, продолжайте, следуя инструкциям ниже:
Добавьте EasyDI к вашему пути к классам. С Maven это будет:
<dependency>
<groupId>eu.lestard</groupId>
<artifactId>easy-di</artifactId>
<version>0.3.0</version>
</dependency>
Добавьте тип оболочки для вашего Шлюза и настройте Поставщик соответственно:
public class GatewayContainer {
Set<Gateway> gateways;
public void setGateways(Set<Gateway> gateways) {
this.gateways = gateways;
}
}
public class GatewayProvider implements Provider<GatewayContainer> {
@Override
public GatewayContainer get() {
try {
File file = new File(getClass().getResource("/gateways.json").toURI());
Type listType = new TypeToken<Set<Gateway>>() {
}.getType();
Set<Gateway> set = new Gson().fromJson(new FileReader(file), listType);
GatewayContainer container = new GatewayContainer();
container.setGateways(set);
return container;
} catch (URISyntaxException | FileNotFoundException e) {
e.printStackTrace();
}
return new GatewayContainer();
}
}
Настройка и использование вашего контекста:
public class AppRunner {
GatewayContainer container;
public AppRunner(GatewayContainer container) {
this.container = container;
}
public static void main(String[] args) {
EasyDI context = new EasyDI();
context.bindProvider(GatewayContainer.class, new GatewayProvider());
final AppRunner runner = context.getInstance(AppRunner.class);
}
}
После этого вы получите AppRunner со всеми введенными зависимостями.
Примечание: Нет использования каких-либо @Inject
(или подобных) аннотаций, потому что EasyDI не требует его по умолчанию