Hasta el momento, no tenía una definición muy simple de frijol que se parecía a esto:
@Bean
@Conditional(value=ConditionClass.class)
SomeInterface myMethodImpl(){
return new ImplementationOne();
}
Sin embargo, ahora tengo situación en la que se ha añadido la clase de implementación adicional, vamos a llamarlo ImplementationTwo
, que debe ser usado en lugar de ImplementationOne
cuando la opción está habilitada en el archivo de configuración.
Así que lo que necesito es algo como esto:
@Bean
@Conditional(value=ConditionClass.class)
SomeInterface myMethodImpl(){
return context.getEnvironment().getProperty("optionEnabled") ? new
ImplementationOne() : new ImplementationTwo();
}
Básicamente una manera de crear una instancia de la aplicación correcta en el momento de frijol definición basada en el valor de configuración. ¿Es esto posible y puede alguien por favor dar un ejemplo? Gracias
Es posible implementar esto sin usar @Conditional
.
Asumiendo que tiene un interfaz SomeInterface
y dos implementaciones ImplOne
ImplTwo
:
SomeInterface.java
public interface SomeInterface {
void someMethod();
}
ImplOne.java
public class ImplOne implements SomeInterface{
@Override
public void someMethod() {
// do something
}
}
ImplTwo.java
public class ImplTwo implements SomeInterface{
@Override
public void someMethod() {
// do something else
}
}
A continuación, puede controlar qué aplicación se utiliza en una clase de configuración de esta manera:
MyConfig.java
@Configuration
public class MyConfig {
@Autowired
private ApplicationContext context;
@Bean
public SomeInterface someInterface() {
if (this.context.getEnvironment().getProperty("implementation") != null) {
return new ImplementationOne();
} else {
return new ImplementationTwo();
}
}
}
Asegúrese de que el componente de exploración de los hallazgos de la primavera MyConfig
. A continuación, se puede utilizar @Autowired
para inyectar la aplicación correcta en cualquier otro lugar en el código.