Как узнать, какой бин был введен в интерфейс?
Поэтому у меня есть набор пакетов, которые являются моим базовым кодом для расширенных приложений. Мое приложение реализует серию интерфейсов, которые затем добавляются весной во время выполнения (как настроено). Я хотел бы знать, есть ли способ узнать, какой класс, который реализует интерфейс, был внедрен. Мне это нужно, потому что у меня есть действия 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 - аннотации Джексона для обработки не подходящего конструктора