Я хотел бы создать в Spring аннотацию квалификатора с несколькими атрибутами; только эта часть работает так, как ожидалось.
Кроме того, я бы хотел, чтобы «значение» и другой атрибут были псевдонимами друг друга. Для этого Spring предлагает аннотацию @AliasFor.
Могут ли они вообще сочетаться? Дело в том, что @AliasFor действительно имеет эффект, поэтому Spring явно что-то с ним делает. Но это не работает; кажется, что на самом деле он полностью нарушает квалификатор.
Ниже приведен одноклассовый пример того, как, по моему мнению, это должно работать, если оно вообще работает. @MetaQualifier определяет два атрибута — value и name — как псевдонимы друг друга.
Я объявляю компонент и квалифицирую его через значение
Я объявляю компонент и квалифицирую его через значение
Я объявляю компонент и квалифицирую его через значение
код>. Я запрашиваю компонент, квалифицированный либо по значению, либо по имени. Если псевдонимы работают, обе инъекции должны работать. Но ни то, ни другое. Я ожидал, что по крайней мере тот, который запрошен через value, сработает.
Но теперь закомментируйте @AliasFor, и внедрение в useTestValue(...) внезапно сработает. Прокомментируйте @Bean testNamed(), и оба работают. (Это не приближает меня к моей цели, но это интересный эксперимент.)
Таким образом, @AliasFor явно имеет эффект, даже если он не кажется полезным. один. Добавление других случайных аннотаций не имеет никакого эффекта, поэтому этот эффект кажется уникальным для @AliasFor. Если @AliasFor не поддерживается для квалификаторов, я ожидал, что он вообще не окажет никакого эффекта или будет рассматриваться как любая другая аннотация, но, похоже, это не имеет смысла.
Есть ли способ заставить это работать или оно обречено с самого начала?
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;
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... -in-spring
Можете ли вы объединить @Qualifier и @AliasFor весной? ⇐ JAVA
Программисты JAVA общаются здесь
-
Anonymous
1735038896
Anonymous
Я хотел бы создать в Spring аннотацию квалификатора с несколькими атрибутами; только эта часть работает так, как ожидалось.
Кроме того, я бы хотел, чтобы «значение» и другой атрибут были псевдонимами друг друга. Для этого Spring предлагает аннотацию @AliasFor.
Могут ли они вообще сочетаться? Дело в том, что @AliasFor действительно имеет эффект, поэтому Spring явно что-то с ним делает. Но это не работает; кажется, что на самом деле он полностью нарушает квалификатор.
Ниже приведен одноклассовый пример того, как, по моему мнению, это должно работать, если оно вообще работает. @MetaQualifier определяет два атрибута — value и name — как псевдонимы друг друга.
Я объявляю компонент и квалифицирую его через значение
Я объявляю компонент и квалифицирую его через значение
Я объявляю компонент и квалифицирую его через значение
код>. Я запрашиваю компонент, квалифицированный либо по значению, либо по имени. Если псевдонимы работают, обе инъекции должны работать. Но ни то, ни другое. Я ожидал, что по крайней мере тот, который запрошен через value, сработает.
Но теперь закомментируйте @AliasFor, и внедрение в useTestValue(...) внезапно сработает. Прокомментируйте @Bean testNamed(), и оба работают. (Это не приближает меня к моей цели, но это интересный эксперимент.)
Таким образом, @AliasFor явно имеет эффект, даже если он не кажется полезным. один. Добавление других случайных аннотаций не имеет никакого эффекта, поэтому этот эффект кажется уникальным для @AliasFor. Если @AliasFor не поддерживается для квалификаторов, я ожидал, что он вообще не окажет никакого эффекта или будет рассматриваться как любая другая аннотация, но, похоже, это не имеет смысла.
Есть ли способ заставить это работать или оно обречено с самого начала?
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;
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79305432/can-you-combine-qualifier-and-aliasfor-in-spring[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия