Доступ к контексту приложения Spring во внешнем объекте библиотеки - PullRequest
0 голосов
/ 20 апреля 2020

Я использую библиотеку Spring Kafka и хочу создать перехватчики с доступом к ApplicationContext. Однако эта библиотека создает объект для меня и не вводит зависимости.

@Component
public class ExampleProducerInterceptor extends ProducerInterceptor<Object, Object> {
  @Autowired
  private Environment environment;
  ...
}

application.yaml:

spring:
  kafka:
    properties:
      "interceptor.classes": com.example.ExampleproducerInterceptor

Кафка сама использует это свойство для создания объекта, вызывая конструктор по умолчанию, вне пружины.

Каковы методы доступа к приложению, как это? Могу ли я, например, предоставить класс-делегат Kafka для вызова там конструктора по умолчанию?

У меня уже есть некоторый код для настройки kafka до его создания, поэтому я могу также изменить имя класса перед этим:

@Autowired
private List<ProducerInterceptor> producerInterceptors;

List<String> producerClassNames = producerInterceptors
  .map(Object::getClass)
  .map(Class::getName)
  .map(str -> str + "$enhancedBySpring") // Point to delegate class?
  .collect(Collectors.toList());

1 Ответ

0 голосов
/ 20 апреля 2020

Я не уверен, чего пытается достичь ваш последний фрагмент кода.

В зависимости от сложности вашего приложения, вы можете хранить ApplicationContext в классе stati c "holder" или в ThreadLocal и инициализируйте перехватчик при первом вызове на send() или в CTOR по умолчанию.

public class ContextHolder {

    private static final ApplicationContext context;

...

}

или

```java
public class ContextHolder {

    private final ThreadLocal<ApplicationContext> contexts = new ThreadLocal<>();

...
...