0

Could someone give me advice, please, how to re-write some method using simple Spring (w/o Boot)? Here I have some code methods:

1. createInjector

private Injector injector;
someMethod(){
injector = Guice.createInjector(new ExampleClass1(), new ExampleClass2());}

2 setModules(Modules.override

setModules(Modules.override(new ExampleClass3()).with(new ExampleClass4()));

//////////////////////////////////////////////////////////////////

public static void setModules(Module... modules) {
    initInjector(modules);
}

private static void initInjector(Module... modules) {
    injector = Guice.createInjector(modules);
}

}

seugen
  • 13
  • 1
  • 3

1 Answers1

0

Taking the risk that my answer is too general.

Roughly saying you can think Guice modules as equivalent a configuration class with @Configuration annotation, that contains @Bean etc.

The Guice injector can be considered as equivalent to the Spring ApplicationContext.

So for example if we have two configuration files:

@Configuration
public class ConfigA {

    @Bean
    ExampleClass1 exampleClass1(){
        return  new ExampleClass1();
    }
    @Bean
    ExampleClass2 exampleClass2(){
        return  new ExampleClass2();
    }
}

@Configuration
public class ConfigB {
    @Bean
    ExampleClass1 exampleClass1(){
        return  new ExampleClass1();
    }
    @Bean
    ExampleClass3 exampleClass2(){
        return  new ExampleClass3();
    }
}

And Services ExampleClass4 that you want as alternative of ExampleClass3. You may use the @Primary annotation

public class ExampleClass4 extends ExampleClass3 {
    @Override
    public String toString() {
        return "ExampleClass4{}";
    }
}

@Configuration
public class ConfigC {

    @Bean
    @Primary
    ExampleClass3 exampleClass3(){
        return new ExampleClass4();
    }
}

So rewriting the app to Spring (core 5.2, not Spring boot) will be:

public class App {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext ap = initAppContext();
        overrideBinding(ap);
        System.out.println(ap.getBean(ExampleClass3.class));
        //prints ExampleClass4{}
    }

    private static AnnotationConfigApplicationContext initAppContext() {
        AnnotationConfigApplicationContext ap = new AnnotationConfigApplicationContext();
        ap.register(ConfigA.class, ConfigB.class);
        return ap;
    }

    private static void overrideBinding(AnnotationConfigApplicationContext ap) {
        ap.register(ConfigC.class);
        ap.refresh();
    }
}

This technic of overriding a binding will work only because ExampleClass3 wasn't defined as primary, if it doesn't that would not work and you need to consider a different approach.

For more information:
https://www.baeldung.com/spring-application-context
https://docs.spring.io/spring-javaconfig/docs/1.0.0.m3/reference/html/modularizing-configurations.html
Override bean definition in java config

Haim Raman
  • 11,508
  • 6
  • 44
  • 70