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