Können Sie @Qualifier und @AliasFor im Frühjahr kombinieren?
Posted: 24 Dec 2024, 12:14
Ich möchte in Spring eine Qualifikationsanmerkung mit mehreren Attributen erstellen. Dieser Teil allein funktioniert wie erwartet.
Außerdem möchte ich, dass der „Wert“ und ein anderes Attribut Aliase füreinander sind. Dafür bietet Spring die Annotation @AliasFor an.
Kann man beides überhaupt kombinieren? Die Sache ist die, dass @AliasFor tatsächlich einen Effekt hat, also macht Spring eindeutig etwas damit. Aber es funktioniert nicht; es scheint den Qualifizierer tatsächlich komplett zu zerstören.
Unten ist ein Ein-Klassen-Beispiel dafür, wie es meiner Meinung nach funktionieren sollte, wenn es überhaupt funktioniert. @MetaQualifier definiert zwei Attribute – Wert und benannt – als Aliase voneinander.
Ich deklariere eine Bean und qualifiziere sie über den Wert. Ich fordere die Bean an, die entweder über den Wert oder den Namen qualifiziert ist. Wenn die Aliase funktionieren, sollten beide Injektionen funktionieren. Aber auch nicht. Ich hätte erwartet, dass zumindest der über value angeforderte funktioniert.
Aber jetzt kommentieren Sie @AliasFor aus und die Injektion bei useTestValue(...) funktioniert plötzlich. Kommentar im @Bean testNamed() und beide funktionieren. (Das bringt mich meinem Ziel nicht näher, aber es ist ein interessantes Experiment.)
Das @AliasFor hat also eindeutig eine Wirkung, auch wenn es nicht nützlich zu sein scheint eins. Das Hinzufügen anderer zufälliger Anmerkungen hat keine Auswirkung, daher scheint der Effekt nur bei @AliasFor zu gelten. Wenn @AliasFor für Qualifizierer nicht unterstützt wird, hätte ich erwartet, dass es überhaupt keine Auswirkung hat oder wie jede andere Annotation behandelt wird, aber das scheint keinen Sinn zu ergeben.
Gibt es eine Möglichkeit? Damit das funktioniert, oder ist es von Anfang an zum Scheitern verurteilt?
Außerdem möchte ich, dass der „Wert“ und ein anderes Attribut Aliase füreinander sind. Dafür bietet Spring die Annotation @AliasFor an.
Kann man beides überhaupt kombinieren? Die Sache ist die, dass @AliasFor tatsächlich einen Effekt hat, also macht Spring eindeutig etwas damit. Aber es funktioniert nicht; es scheint den Qualifizierer tatsächlich komplett zu zerstören.
Unten ist ein Ein-Klassen-Beispiel dafür, wie es meiner Meinung nach funktionieren sollte, wenn es überhaupt funktioniert. @MetaQualifier definiert zwei Attribute – Wert und benannt – als Aliase voneinander.
Ich deklariere eine Bean und qualifiziere sie über den Wert. Ich fordere die Bean an, die entweder über den Wert oder den Namen qualifiziert ist. Wenn die Aliase funktionieren, sollten beide Injektionen funktionieren. Aber auch nicht. Ich hätte erwartet, dass zumindest der über value angeforderte funktioniert.
Aber jetzt kommentieren Sie @AliasFor aus und die Injektion bei useTestValue(...) funktioniert plötzlich. Kommentar im @Bean testNamed() und beide funktionieren. (Das bringt mich meinem Ziel nicht näher, aber es ist ein interessantes Experiment.)
Das @AliasFor hat also eindeutig eine Wirkung, auch wenn es nicht nützlich zu sein scheint eins. Das Hinzufügen anderer zufälliger Anmerkungen hat keine Auswirkung, daher scheint der Effekt nur bei @AliasFor zu gelten. Wenn @AliasFor für Qualifizierer nicht unterstützt wird, hätte ich erwartet, dass es überhaupt keine Auswirkung hat oder wie jede andere Annotation behandelt wird, aber das scheint keinen Sinn zu ergeben.
Gibt es eine Möglichkeit? Damit das funktioniert, oder ist es von Anfang an zum Scheitern verurteilt?
Code: Select all
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.AliasFor;
@Configuration
public class QualiasForTestConfig
{
@Bean
@MetaQualifier(value = "qualifier")
Test testValue()
{
return new Test("value");
}
// @Bean
// @MetaQualifier(named = "qualifier")
// Test testNamed()
// {
// return new Test("named");
// }
@Bean
String usageTestValue(@MetaQualifier(value = "qualifier") Test testValue)
{
return "Yay!";
}
@Bean
String usageTestNamed(@MetaQualifier(named = "qualifier") Test testNamed)
{
return "Yay!";
}
@Target({ElementType.PARAMETER, ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
@Documented
public @interface MetaQualifier
{
@AliasFor("named")
String value() default "";
@AliasFor("value")
String named() default "";
}
static class Test
{
private final String text;
public Test(String text)
{
this.text = text;
}
@Override
public String toString()
{
return text;
}
}
}