복붙노트

[SPRING] Spring 빈을 생성하면 ServletRequest 프로퍼티를 갖는다.

SPRING

Spring 빈을 생성하면 ServletRequest 프로퍼티를 갖는다.

Spring bean을 생성하여 HttpServletRequest 객체의 serverName, serverPort, contextPath 속성을 저장하여 필요할 때마다이 bean을 다른 bean에 주입 할 수 있도록해야합니다.

제 생각에, 이러한 속성은 어떤 URI와도 변경되지 않으므로 이것을 한 번 초기화하는 것이 좋습니다 (어쨌든 여러 번 요청 인스턴스를 전달하는 것은 그렇게 비싸지 않습니다).

문제는 어떻게 구성 빈에 HttpServletRequest 인스턴스를 삽입 할 수 있습니까? 나는 XML 기반의 주입을 선호한다. 대부분 우리는 이것을 로 주입해야하지만,이 ServletRequest 객체의 이름이나 참조가 무엇인지는 알지 못합니다.

목표는 빈에서 이들 변수를 유지하여 빈에서 액세스 할 수있게하고 serverName 등을 얻기 위해 여러 메소드에 요청 메소드를 인수로 전달할 필요가 없습니다.

그러한 아이디어를 어떻게 만들 수 있습니까?

해결법

  1. ==============================

    1.요청 범위의 빈을 사용하여이 작업을 수행 할 수 있으며 현재 요청을 사용자 bean으로 autowiring 할 수 있습니다.

    요청 범위의 빈을 사용하여이 작업을 수행 할 수 있으며 현재 요청을 사용자 bean으로 autowiring 할 수 있습니다.

    public class RequestHolder {
       private @Autowired HttpServletRequest request;
    
       public String getServerName() {
          return request.getServerName();
       }
    }
    

    그리고 XML에서 :

    <bean id="requestHolder" class="com.x.RequestHolder" scope="request">
      <aop:scoped-proxy/>
    </bean>
    

    그런 다음 requestHolder 빈을 선택한 빈 비즈니스 로직 빈으로 연결할 수있다.

    에 주목하라. 이것은 request-scoped bean을 싱글 톤에 주입하는 가장 쉬운 방법이다. Spring 문서에서 어떻게 작동하는지, 그리고 aop 네임 스페이스를 어떻게 구성 하는지를 보라.

  2. from https://stackoverflow.com/questions/3514883/creating-a-spring-bean-holds-servletrequest-properties by cc-by-sa and MIT license