Задать вопрос
@artemfisher

Как из объекта HttpServletRequest получить бин с областью действия @Scope("request")?

Добрый день!

В документации сказано:
https://docs.spring.io/spring-framework/reference/...


As an alternative to factory scopes, a Spring WebApplicationContext also supports the injection of HttpServletRequest, HttpServletResponse, HttpSession, WebRequest and (if JSF is present) FacesContext and ExternalContext into Spring-managed beans, simply through type-based autowiring next to regular injection points for other beans. Spring generally injects proxies for such request and session objects which has the advantage of working in singleton beans and serializable beans as well, similar to scoped proxies for factory-scoped beans.


Т.е. получается, что с помощью объекта HttpServletRequest я могу получить бин с областью действия @Scope("request").

Смотрю атрибуты, которые привязаны к HttpServletRequest:
org.springframework.web.context.request.async.WebAsyncManager.WEB_ASYNC_MANAGER
org.springframework.web.servlet.HandlerMapping.bestMatchingHandler
org.springframework.web.servlet.DispatcherServlet.CONTEXT
org.springframework.web.servlet.resource.ResourceUrlProvider
org.springframework.web.servlet.HandlerMapping.matrixVariables
org.springframework.web.servlet.DispatcherServlet.THEME_SOURCE
org.springframework.web.util.ServletRequestPathUtils.PATH
org.springframework.web.servlet.DispatcherServlet.LOCALE_RESOLVER
org.springframework.web.servlet.HandlerMapping.bestMatchingPattern
org.springframework.web.servlet.DispatcherServlet.OUTPUT_FLASH_MAP
org.springframework.web.servlet.HandlerMapping.pathWithinHandlerMapping
org.springframework.web.servlet.DispatcherServlet.FLASH_MAP_MANAGER
org.springframework.web.servlet.HandlerMapping.uriTemplateVariables
org.springframework.core.convert.ConversionService
org.springframework.web.servlet.DispatcherServlet.THEME_RESOLVER


Из этого списка получается, что только с помощью org.springframework.web.servlet.DispatcherServlet.CONTEXT я смогу получить нужный мне бин. Т.е. фактически, явно обратившись к контексту.

Бин
@Component("mainLogger")
@Scope("request")
public class MainLogger {
	
	int n = ThreadLocalRandom.current().nextInt();
	
	void print() 
	{				
		System.out.println(n);		
	}
}


Получаем его

@Controller
@RequestMapping("/")
public class MainController {		
	
	@Autowired
	ApplicationContext context;
	
	
	@Autowired
	HttpServletRequest request;	
	
	@GetMapping
	String getIndex()
	{				
		var context = request.getAttribute("org.springframework.web.servlet.DispatcherServlet.CONTEXT");
				
		var logger = ((BeanFactory)context).getBean(MainLogger.class);
		
		logger.print();
				
		return "main";
	}
}


Все работает, естественно. Но только кода слишком много. Может я что-то не так понял и есть другой способ получить бин из HttpServletRequest?
  • Вопрос задан
  • 7 просмотров
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы