7

Mein Ziel ist ein Framework, in dem konkrete Arten von Beans leicht durch eine Eigenschaftendatei geändert werden können. Ich bevorzuge auch Anmerkungen zu XML. Im Idealfall würde ich so eine Kombination von @Resource und Spel verwenden:Spring Autowire mit Annotationen und einem Typ in einer Eigenschaftendatei definiert?

@Resource(type="#{myProperties['enabled.subtype']}") 
SomeInterface foo; 

wo ich myProperties mit einem PropertiesFactoryBean oder <util:properties> aus einer Datei geladen haben, der folgendes beinhaltet:

enabled.type = com.mycompany.SomeClassA; // which implements SomeInterface 

Dies gilt nicht arbeiten, weil das Argument type ein Literal sein muss, dh kein SpEL erlaubt. Was ist die beste Vorgehensweise hier?

Update: Siehe meine Antwort unten.

Antwort

1

Ich denke, dass es nicht möglich ist, die Lösung, die ich tendiere, ist, eine Fabrik zu verwenden, die die verschiedenen Objekte abhängig von einer Konfigurationseigenschaft (enabled.type in Ihrem Beispiel) erstellt.

könnten Eine zweite Alternative Injektion von Namen zu verwenden:

@Resource(name="beanName") 

Und schließlich, wenn Sie Frühling verwenden 3.1+ Sie Profile verwenden können versuchen, und haben unterschiedliche Bohnen Sets in verschiedenen Profilen, wenn das löst Ihr Problem.

1

Spring's Java Configuration und Bean Definition Profiles erweisen sich als genau das, was ich gesucht habe (danke @ Adam-Gent und @ Guido-Garcia). Ersteres scheint für das dynamische Element notwendig zu sein, letzteres fördert eine bessere Praxis.

Hier ist eine Lösung mit Java config und Eigenschaften:

@Configuration 
public class SomeClassConfig { 
    @Value("#{myProperties['enabled.subtype']}") 
    public Class enabledClass; 

    @Bean SomeInterface someBean() 
       throws InstantiationException, IllegalAccessException { 
     return (SomeInterface) enabledClass.newInstance(); 
    } 
} 

Hier ist eine etwas weniger dynamische Lösung mit Profilen.

@Configuration 
@Profile("dev") 
public class DevelopmentConfig { 
    @Bean SomeInterface someBean() { 
     return new DevSubtype(); 
    } 
} 

@Configuration 
@Profile("prod") 
public class ProductionConfig { 
    @Bean SomeInterface someBean() { 
     return new ProdSubtype(); 
    } 
} 

mit einem Profil, das aktive Profil (en) ist erklärt unter Verwendung eines von A variety of methods wie über die Systemeigenschaft, JVM Eigenschaft, web.xml, etc. Zum Beispiel mit einer JVM Eigenschaft:

-Dspring.profiles.active="dev" 
+0

Wenn Sie faul sind, betrachten Sie @Bean (autowire = Autowire.BY_TYPE). –