Как узнать, какой бин был введен в интерфейс?

Поэтому у меня есть набор пакетов, которые являются моим базовым кодом для расширенных приложений. Мое приложение реализует серию интерфейсов, которые затем добавляются весной во время выполнения (как настроено). Я хотел бы знать, есть ли способ узнать, какой класс, который реализует интерфейс, был внедрен. Мне это нужно, потому что у меня есть действия JSON-сериализатора / десериализатора, которые я хотел бы выполнить, но для этого мне нужно знать, какой класс был внедрен.

У меня есть файл конфигурации Java, который будет описывать проводку, и он будет предоставлен с реализацией игры. Но до сих пор я не смог получить конкретный класс, реализующий интерфейс. Мне также не удалось запросить эту информацию из контекста.

Муравей намекает?

3 ответа

Решение

Таким образом, я решил эту проблему, внедрив объект в десериализатор JSON и используя метод getClass() в качестве шаблона для использования Джексоном. И это работало как очарование, даже если мысль о том, что внедряемая реализация была внедрена в проводку, происходящую в зависимости! Надеюсь, поможет!

Вы можете использовать отражение, чтобы позволить внедренному экземпляру сообщить вам, что это за класс реализации: injectedInstance.getClass().getName(), Однако, если вы не делаете что-то особенное, считайте это хаком. Вы, вероятно, должны пересмотреть свой дизайн, чтобы вам не нужно было это делать.

Вы можете просто автоматически подключить интерфейс и получить имя реализованного класса:

@Autowired
private Service service;

System.out.println(service.getClass().getName());

Однако с бобами Spring контейнер Spring обычно проксирует их, так что это не всегда полезно, в приведенном выше случае класс Spring называется:

hello.HelloServiceImpl$$EnhancerBySpringCGLIB$$ad2e225d

Я подозреваю, что вы должны взглянуть на сериализаторы Jackson, которые должны обрабатывать все это, см. Java - аннотации Джексона для обработки не подходящего конструктора

Другие вопросы по тегам