복붙노트

[SPRING] 스프링을 사용하여 서블릿에 객체를 삽입하고 싶습니다.

SPRING

스프링을 사용하여 서블릿에 객체를 삽입하고 싶습니다.

내 응용 프로그램에서 두 개의 서블릿이 있고 A 클래스의 개체를 두 서블릿 모두에 주입하려면 응용 프로그램 전체에서 동일한 ApplicationContext, 즉이 질문의 첫 번째 대답에서 언급 한 두 가지 서블릿이 모두 필요합니다. 서블릿으로의 스프링 주입

지금 나는 이와 같은 많은 질문을 겪었지만 내 질문과 정확히 일치하는 것을 발견하지 못했습니다. 보다 잘 설명하기 위해 대략적인 코드를 작성하십시오.

public class servletOne extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

    }
}

public class servletTwo extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

    }
}

그래서 위의 두 개의 서블릿이 applicationContext.xml에 있습니다.이 두 서블릿 모두에 객체를 전달하려면 일반 협약에 따라 다음과 같은 기능을 원합니다.

<bean id="servletFirst" class="mypackage.servletOne">
        <property name="message" ref="classObject" />


</bean>
<bean id="servletFirst" class="mypackage.servletTwo">
        <property name="message" ref="classObject" />


</bean>

<bean id="classObject" class="mypackage.classA">

    </bean>

나는 이것이 가능한지 아닌지, 나는 봄이 처음이다. 그리고 나는 의존성 주입에 대한 기본적인 지식 만 갖고있다.

누구든지 이걸 도와 줄 수 있다면 정말 고맙겠습니다. 이렇게하면 많은 의심이 사라지고 봄을 배우는 과정에서 앞으로 나아갈 수 있습니다.

이것은 web.xml입니다.

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet>
        <servlet-name>servletOne</servlet-name>
        <servlet-class>mypackage.servletOne</servlet-class>
    </servlet>
<servlet>
        <servlet-name>servletTwo</servlet-name>
        <servlet-class>mypackage.servletTwo</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>servletOne</servlet-name>
        <url-pattern>/servletOne</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>servletTwo</servlet-name>
        <url-pattern>/servletTwo</url-pattern>
    </servlet-mapping>

    <session-config>
        <session-timeout>
            300
        </session-timeout>
    </session-config>
</web-app>

해결법

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

    1.Servlets과 Spring의 ApplicationContext의 두 개념을 혼합하고있다. 서블릿은 서블릿 컨테이너에서 관리합니다. 예를 들어 Tomcat을 예로 들어 봅시다. ApplicationContext는 Spring에 의해 관리된다.

    Servlets과 Spring의 ApplicationContext의 두 개념을 혼합하고있다. 서블릿은 서블릿 컨테이너에서 관리합니다. 예를 들어 Tomcat을 예로 들어 봅시다. ApplicationContext는 Spring에 의해 관리된다.

    배포 설명자에 서블릿을 다음과 같이 선언하면

    <servlet>
        <servlet-name>servletOne</servlet-name>
        <servlet-class>mypackage.servletOne</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>servletOne</servlet-name>
        <url-pattern>/servletOne</url-pattern>
    </servlet-mapping>
    

    Servlet 컨테이너는 mypackage.servletOne 클래스의 인스턴스를 생성하고 등록하며 요청을 처리하는 데 사용합니다. 이것이 Spring MVC의 기초가되는 DispatcherServlet의 기능입니다.

    Spring은 ApplicationContext를 사용하여 많은 빈을 관리하는 IoC 컨테이너이다. ContextLoaderListener는 루트 ApplicationContext를로드합니다 (사용자가 지정한 위치에서). DispatcherServlet은 해당 루트 컨텍스트를 사용하며 자체 컨텍스트도로드해야합니다. 컨텍스트에는 DispatcherServlet이 작동하기위한 적절한 구성이 있어야합니다.

    Spring 컨텍스트에서 Bean 선언하기

    <bean id="servletFirst" class="mypackage.servletOne">
            <property name="message" ref="classObject" />
    </bean>
    

    web.xml에 선언 된 과 동일한 유형이라는 사실에 관계없이 완전히 무관합니다. 위의 bean은 web.xml의 선언과 아무런 관련이 없습니다.

    ContextLoaderListener는 속성으로 ServletContext에 생성 한 ApplicationContext를 넣기 때문에 ApplicationContext는 모든 Servlet 컨테이너 관리 객체에서 사용할 수 있습니다. 따라서 사용자 정의 HttpServlet 클래스에서 HttpServlet # init (ServletConfig)를 재정의 할 수 있습니다.

    @Override
    public void init(ServletConfig config) throws ServletException {
       super.init(config);
    
       ApplicationContext ac = (ApplicationContext) config.getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
    
       this.someObject = (SomeBean)ac.getBean("someBeanRef");
    }
    

    루트 ApplicationContext에 someBeanRef라는 빈이 있다고 가정합니다.

    이에 대한 다른 대안이 있습니다. 예를 들면.

  2. ==============================

    2.@Autowired를 사용하거나 applicationContext.xml을 통해 속성을 설정하려면 클래스에 @Controller annotation으로 주석을 추가하십시오.

    @Autowired를 사용하거나 applicationContext.xml을 통해 속성을 설정하려면 클래스에 @Controller annotation으로 주석을 추가하십시오.

  3. from https://stackoverflow.com/questions/21054013/i-want-to-inject-an-object-in-servlet-using-spring by cc-by-sa and MIT license