Guice 和(移动到)的比较 Spring
Comparison of Guice and(move to) Spring
有人能给我建议吗,如何使用简单的 Spring(w/o 启动)重写一些方法?
这里我有一些代码方法:
1.创建注射器
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);
}
}
冒着我的回答过于笼统的风险。
粗略地说,您可以将 Guice 模块视为等同于带有 @Configuration 注释的配置 class,其中包含 @Bean 等
Guice 注入器可以被认为等同于 Spring ApplicationContext。
例如,如果我们有两个配置文件:
@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();
}
}
以及您想要替代 ExampleClass3 的服务 ExampleClass4。
您可以使用@Primary 注释
public class ExampleClass4 extends ExampleClass3 {
@Override
public String toString() {
return "ExampleClass4{}";
}
}
@Configuration
public class ConfigC {
@Bean
@Primary
ExampleClass3 exampleClass3(){
return new ExampleClass4();
}
}
因此将应用程序重写为 Spring(核心 5.2,而不是 Spring 启动)将是:
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();
}
}
这种覆盖绑定的技术之所以有效,是因为 ExampleClass3 没有被定义为主要的,如果不是这样,那将不起作用,您需要考虑不同的方法。
更多信息:
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
有人能给我建议吗,如何使用简单的 Spring(w/o 启动)重写一些方法? 这里我有一些代码方法:
1.创建注射器
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);
}
}
冒着我的回答过于笼统的风险。
粗略地说,您可以将 Guice 模块视为等同于带有 @Configuration 注释的配置 class,其中包含 @Bean 等
Guice 注入器可以被认为等同于 Spring ApplicationContext。
例如,如果我们有两个配置文件:
@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();
}
}
以及您想要替代 ExampleClass3 的服务 ExampleClass4。 您可以使用@Primary 注释
public class ExampleClass4 extends ExampleClass3 {
@Override
public String toString() {
return "ExampleClass4{}";
}
}
@Configuration
public class ConfigC {
@Bean
@Primary
ExampleClass3 exampleClass3(){
return new ExampleClass4();
}
}
因此将应用程序重写为 Spring(核心 5.2,而不是 Spring 启动)将是:
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();
}
}
这种覆盖绑定的技术之所以有效,是因为 ExampleClass3 没有被定义为主要的,如果不是这样,那将不起作用,您需要考虑不同的方法。
更多信息:
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