Las anotaciones condicionales en Spring permiten registrar beans de manera dinámica según el entorno actual. Cuando se satisface una condición específica, el bean correspondiente se incorpora al contetxo de la aplicación.
Ejemplo práctico con código:
1. Interfaz CommandDisplay.java
package com.example.springdemo;
public interface CommandDisplay {
String retrieveCommand();
}
2. Implementación WindowsCommand.java
package com.example.springdemo;
public class WindowsCommand implements CommandDisplay {
public String retrieveCommand() {
return "dir";
}
}
3. Implementación LinuxCommand.java
package com.example.springdemo;
public class LinuxCommand implements CommandDisplay {
public String retrieveCommand() {
return "ls";
}
}
4. Clase de condición WindowsEnvironmentCondition.java
package com.example.springdemo;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
public class WindowsEnvironmentCondition implements Condition {
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
String system = context.getEnvironment().getProperty("os.name");
return system.toLowerCase().contains("win");
}
}
5. Clase de condición LinuxEnvironmentCondition.java
package com.example.springdemo;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
public class LinuxEnvironmentCondition implements Condition {
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
String system = context.getEnvironment().getProperty("os.name");
return system.toLowerCase().contains("linux");
}
}
6. Clase de configuración AppConfig.java
package com.example.springdemo;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean("cmd")
@Conditional(WindowsEnvironmentCondition.class)
CommandDisplay provideWindowsCommand() {
return new WindowsCommand();
}
@Bean("cmd")
@Conditional(LinuxEnvironmentCondition.class)
CommandDisplay provideLinuxCommand() {
return new LinuxCommand();
}
}
7. Clase principal Application.java
package com.example.springdemo;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Application {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
CommandDisplay command = (CommandDisplay) ctx.getBean("cmd");
String output = command.retrieveCommand();
System.out.println("Resultado: " + output);
}
}
Al ejecutar el programa, el bean seleccionado variará en función del sistema operativo subyacente.