Как получить доступ к spring beans из объектов, не созданных с помощью spring

В моем веб-приложении я использую hibernate и spring. Классы объектов, возвращаемые с уровня Hibernate, должны иметь доступ к другим классам обслуживания в некоторых сценариях. Классы сущностей - это не просто DTO, они содержат некоторую бизнес-логику, и для выполнения некоторой бизнес-логики (например, могут быть отправлены электронные письма и т.д., Когда выполняются некоторые условия), им необходимо получить доступ к классам услуг. Сервисные классы spring beans. так что рекомендуемый метод в таких сценариях может получить spring beans из этих классов сущностей, которые создаются вне контекста spring?

Ответ 1

Вы ищете шаблон сервис-локатора,

Реализация в Spring

Вы можете зарегистрировать ApplicationContextAware и получить ссылку на ApplicationContext и статически подавать bean

public class ApplicationContextUtils implements ApplicationContextAware {
 private static ApplicationContext ctx;

 private static final String USER_SERVICE = "userServiceBean";

  @Override
  public void setApplicationContext(ApplicationContext appContext)
      throws BeansException {
    ctx = appContext;

  }

  public static ApplicationContext getApplicationContext() {
    return ctx;
  }

  public static UserService getUserService(){return ctx.getBean(USER_SERVICE);}

}

Ответ 2

Прочитайте аннотацию @Configurable, которая позволяет настроить beans с помощью AspectJ:

Если вы не хотите использовать AspectJ, вы можете использовать

ApplicationContext.getAutowireCapableBeanFactory().autowireBean()

для настройки beans, которые находятся вне контейнера spring. (см. java docs).