Anotaciones Condicionales en Spring para Registro Dinámico de Beans

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.

Etiquetas: Spring conditional-annotation java spring-context dependency-injection

Publicado el 6-28 22:36