LINUX.ORG.RU

Java spring autowire для генериков внутри их самих

 ,


0

3

Есть class Test<T>:

@Component
public class Test<T> {
    @Autowired
    public T fld;
    @Autowired
    Something something;
}
Есть оно же в другом месте:
@Component
public class Main {
    @Autowired
    public Test<MyClass> testMyClass;
}
Есть где-то MyClass, не важно суть какой.
Надо, чтобы @Autowired сработал, в моём случае fld - это org.springframework.jmx.export.annotation.AnnotationMBeanExporter, а надо что бы он был MyClass. Это возможно вообще, или придётся лепить что-то в обход spring?

Если хочется нормальной обработки дженериков для инъекций, то стоит всё-таки взять более подходящее решение, соответствующее спецификации CDI, а не доморощенный DI от Spring. Тот же Weld подойдёт прекрасно.

sanwashere ★★
()
Последнее исправление: sanwashere (всего исправлений: 1)
Ответ на: комментарий от crutch_master

Тогда придётся обходиться @Autowired ApplicationContext и ApplicationContext#getBean().

sanwashere ★★
()

@Autowired
public T fld;

У тебя же в рантайме нет инфы о классе, чего он тебе инжектить туда будет?

hippi90 ★★★★★
()
public class Test<T> {
    @Autowired
    public T fld;
}

После компиляции это превращается в:

public class Test {
    @Autowired
    public Object fld; // неоднозначность, подходит любой бин
}
Если ты сам точно знаешь какой бин нужно связать то можно наверное использовать @Qualifier:
@Autowired 
@Qualifier( "myClass") 
public Object fld

А вообще программирование это борьба с ограничениями.

anonymous
()
Ответ на: комментарий от anonymous

А вообще программирование это борьба с ограничениями.

Только если все делать через одно место. Кажется мне, ТС тот еще затейник-неумеха.

Deleted
()
Ответ на: комментарий от Deleted

ТС тот еще затейник-неумеха.

И я этого не стесняюсь.

Только если все делать через одно место.

Давай, покажи, как сделать правильно.

crutch_master ★★★★★
() автор топика
Ответ на: комментарий от hippi90

У тебя же в рантайме нет инфы о классе, чего он тебе инжектить туда будет?

Ну, в List он инжектит как-то.

crutch_master ★★★★★
() автор топика
Ответ на: комментарий от sanwashere

Проблема решается написанием своего BeanPostProcessor

Лучше уж убрать с Main'а @Autowired и проинжектить руками. Как-то нагляднее будет, чем свой говноБинПостПроцессор где-то.

crutch_master ★★★★★
() автор топика
Ответ на: комментарий от crutch_master

Я так вообще сторонник писать логику без «мусорных» аннотаций и на этапе сборки компонентов в кучу делаю DI обёртки. Получается нормальное разделение, как для тестирования, так и для всяких рефакторингов.

sanwashere ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.