복붙노트

[SPRING] web.xml의 applicationContext.xml 파일 대신 Spring @Configuration annotated 클래스를 등록하는 방법은 무엇입니까?

SPRING

web.xml의 applicationContext.xml 파일 대신 Spring @Configuration annotated 클래스를 등록하는 방법은 무엇입니까?

웹 응용 프로그램에서 jsf와 spring을 함께 사용하고 있습니다. @Configuration, @ComponentScan 등의 주석을 사용하는 하나의 구성 클래스에 데이터 소스 및 세션 팩토리를 구성했습니다. Configuration 클래스의 컨텍스트 xml의 모든 항목을 처리 할 때마다 내 프로젝트에 applicationContext.xml 파일이 없습니다. 테스트 케이스가 성공적으로 작동하지만 웹 응용 프로그램을 배포하면 오류가 발생합니다.

이제 web.xml에서 listener 클래스를 제공하면,

<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

그것은 나에게 오류를 준다,

ContextLoaderListener의 문서에 따르면 web.xml에 명시 적으로 contextConfigLocation 매개 변수를 지정하지 않으면 web.xml의 applicationContext.xml이라는 기본 스프링 컨텍스트 파일을 검색합니다. Spring 컨텍스트 파일을 사용하고 주석을 사용하여 모든 구성을 수행하지 않으려면 어떻게해야합니까? 어떻게 리스너 클래스 ContextLoaderListener를 등록해야만 xml 파일을 사용하지 않고 주석 만 사용하여 스프링과 jsf로 웹 어플리케이션을 실행할 수 있습니까?

해결법

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

    1.web.xml에서 AnnotationConfigWebApplicationContext를 사용하여 컨텍스트를 부트 스트랩해야합니다.

    web.xml에서 AnnotationConfigWebApplicationContext를 사용하여 컨텍스트를 부트 스트랩해야합니다.

    <servlet>
        <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextClass</param-name>
            <param-value>
                org.springframework.web.context.support.AnnotationConfigWebApplicationContext
            </param-value>
        </init-param>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
                org.package.YouConfigurationAnnotatedClass
            </param-value>
        </init-param>
    </servlet>
    

    그리고 MVC 어노테이션에 @EnableWebMvc를 사용하는 것을 잊지 마십시오.

    추가 읽기 :

    네, 물론 청취자가 필요합니다. 위의 내용은 "web.xml의 applicationContext.xml 파일 대신 Spring @Configuration annotated 클래스를 등록하는 방법"에 대한 질문에 완전히 대답했지만, 다음은 Spring의 공식 문서에서 전체 web.xml을 레이아웃 한 예제입니다.

    <web-app>
      <!-- Configure ContextLoaderListener to use AnnotationConfigWebApplicationContext
           instead of the default XmlWebApplicationContext -->
      <context-param>
          <param-name>contextClass</param-name>
          <param-value>
              org.springframework.web.context.support.AnnotationConfigWebApplicationContext
          </param-value>
      </context-param>
    
      <!-- Configuration locations must consist of one or more comma- or space-delimited
           fully-qualified @Configuration classes. Fully-qualified packages may also be
           specified for component-scanning -->
      <context-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>com.acme.AppConfig</param-value>
      </context-param>
    
      <!-- Bootstrap the root application context as usual using ContextLoaderListener -->
      <listener>
          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
    
      <!-- Declare a Spring MVC DispatcherServlet as usual -->
      <servlet>
          <servlet-name>dispatcher</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          <!-- Configure DispatcherServlet to use AnnotationConfigWebApplicationContext
               instead of the default XmlWebApplicationContext -->
          <init-param>
              <param-name>contextClass</param-name>
              <param-value>
                  org.springframework.web.context.support.AnnotationConfigWebApplicationContext
              </param-value>
          </init-param>
          <!-- Again, config locations must consist of one or more comma- or space-delimited
               and fully-qualified @Configuration classes -->
          <init-param>
              <param-name>contextConfigLocation</param-name>
              <param-value>com.acme.web.MvcConfig</param-value>
          </init-param>
      </servlet>
    
      <!-- map all requests for /app/* to the dispatcher servlet -->
      <servlet-mapping>
          <servlet-name>dispatcher</servlet-name>
          <url-pattern>/app/*</url-pattern>
      </servlet-mapping>
    </web-app>
    
  2. ==============================

    2.여기서 낡은 질문에 부딪 히지 만 최근 버전의 Spring (v3.0 이상)에서는 Servlet 3.0 이상을 지원하는 웹 컨테이너에 응용 프로그램을 배포하는 경우 web.xml을 모두 제거 할 수 있습니다.

    여기서 낡은 질문에 부딪 히지 만 최근 버전의 Spring (v3.0 이상)에서는 Servlet 3.0 이상을 지원하는 웹 컨테이너에 응용 프로그램을 배포하는 경우 web.xml을 모두 제거 할 수 있습니다.

    Spring의 WebApplicationInitializer 인터페이스를 구현하여 web.xml에서 수행하는 것과 동일한 구성을 수행 할 수 있습니다. 이 구현 클래스는 Servlet 3.0+ 컨테이너에서 실행되는 Spring 3.0 이상의 응용 프로그램에 의해 자동으로 감지됩니다. 설정이 간단하다면, 대신 Spring에서 제공하는 다른 클래스를 아래와 같이 사용할 수 있습니다. 모두 여기 @Configuration 클래스를 설정하고 서블릿 매핑을 나열하는 것입니다. 설정을 매우 간단하게 유지합니다.

    public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer{
    
        @Override
        protected Class<?>[] getRootConfigClasses() {
            return null;
        }
    
        @Override
        protected Class<?>[] getServletConfigClasses() {
    
            return new Class[] {AppConfig.class};
        }
    
        @Override
        protected String[] getServletMappings() {
            return new String[] {
                     "*.html"
                    ,"*.json"
                    ,"*.do"};
        }
    }
    
  3. from https://stackoverflow.com/questions/8075790/how-to-register-spring-configuration-annotated-class-instead-of-applicationcont by cc-by-sa and MIT license