Как переопределить Spring Bean, предоставленный сторонней зависимостьюJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как переопределить Spring Bean, предоставленный сторонней зависимостью

Сообщение Anonymous »

Основная идея состоит в том, чтобы переопределить один метод класса
У меня есть класс AwsSpringWebRuntimeInitializer, предоставленный aws-serverless-java-container -springboot3. Он реализует ApplicationContextInitializer для регистрации определенного компонента (AwsSpringWebCustomRuntimeEventLoop) при запуске приложения. Этот класс регистрируется через файл Spring.factories.

Код: Выделить всё

public class AwsSpringWebRuntimeInitializer implements ApplicationContextInitializer {

private static Log logger = LogFactory.getLog(AwsSpringWebRuntimeInitializer.class);

@Override
public void initialize(GenericApplicationContext context) {
logger.info("AWS Environment: " + System.getenv());
Environment environment = context.getEnvironment();
if (logger.isDebugEnabled()) {
logger.debug("AWS Environment: " + System.getenv());
}

if (context instanceof ServletWebServerApplicationContext && isCustomRuntime(environment)) {
if (context.getBeanFactory().getBeanNamesForType(AwsSpringWebCustomRuntimeEventLoop.class, false, false).length == 0) {
context.registerBean(StringUtils.uncapitalize(AwsSpringWebCustomRuntimeEventLoop.class.getSimpleName()),
SmartLifecycle.class, () -> new AwsSpringWebCustomRuntimeEventLoop((ServletWebServerApplicationContext) context));
}
}
}

private boolean isCustomRuntime(Environment environment) {
String handler = environment.getProperty("_HANDLER");
if (StringUtils.hasText(handler)) {
handler = handler.split(":")[0];
logger.info("AWS Handler: " + handler);
try {
Thread.currentThread().getContextClassLoader().loadClass(handler);
}
catch (Exception e) {
logger.debug("Will execute Lambda in Custom Runtime");
return true;
}
}
return false;
}

}
Мне нужно изменить один метод в AwsSpringWebCustomRuntimeEventLoop. Но этот класс также реализует SmartLifecycle, что означает, что он будет вызываться при запуске.

Код: Выделить всё

public final class AwsSpringWebCustomRuntimeEventLoop implements SmartLifecycle
Я попытался исключить весь AwsSpringWebCustomRuntimeEventLoop и заменить его своим аналогом. Я также попытался заменить этот bean-компонент, зарегистрировав новый bean-компонент с тем же именем (используя собственный ApplicationContextInitializer), но он вызывается до AwsSpringWebRuntimeInitializer, поэтому bean-компонент был переопределен одним создано AwsSpringWebRuntimeInitializer. Однако основная проблема заключается в том, что класс AwsSpringWebCustomRuntimeEventLoop запускается при запуске приложения, поэтому изменение контекста в основном методе после запуска приложения бесполезно.
Есть ли способ заменить AwsSpringWebCustomRuntimeEventLoop на мой собственный или даже заменить AwsSpringWebRuntimeInitializer, чтобы создать необходимый bean-компонент? Я не хотел бы копировать всю библиотеку, поэтому надеюсь, что есть более адекватное решение.


Подробнее здесь: https://stackoverflow.com/questions/784 ... dependency
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»