복붙노트

[SPRING] Spring MVC : <context : component-scan>과 <annotation-driven /> 태그의 차이점은 무엇입니까? [복제]

SPRING

Spring MVC : 태그의 차이점은 무엇입니까? [복제]

며칠 전이 봄 Hello World 튜토리얼을 공부하기 시작했습니다. http://viralpatel.net/blogs/spring-3-mvc-create-hello-world-application-spring-3-mvc/

이 튜토리얼에서 Spring DispatcherServlet은 spring-servlet.xml 파일을 사용하여 구성됩니다.

<?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context.xsd">

<context:component-scan base-package="net.viralpatel.spring3.controller" />

<bean id="viewResolver"
    class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass"
        value="org.springframework.web.servlet.view.JstlView" />
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
</bean>

이 파일에서 컨텍스트를 사용하고 있습니다 : component-scan 태그는 Spring이 주석을 검색하는 파일을 스캔해야한다고 말합니다. 예를 들어, 컨트롤러 클래스가 @RequestMapping ( "/ hello") 주석에 의해 주석이 달린 것을 발견하면 이 메소드가 "/ hello"로 끝나는 URL을 향한 HTTP 요청을 처리한다는 것을 알고 있습니다. 이것은 간단합니다 ...

이제 나의 의심은 STS \ Eclipse에서 자동으로 빌드 할 수있는 Spring MVC 템플릿 프로젝트와 관련있다.

STS에서 새로운 Spring MVC 프로젝트를 생성 할 때 DispatcherServlet은 앞의 예제 파일과 비슷한 몇 가지 구성을 포함하는 servlet-context.xml 파일로 구성됩니다.

이 파일에는 여전히 구성 요소 스캔 태그가 있습니다.

<context:component-scan base-package="com.mycompany.maventestwebapp" />

그러나 나는 또 다른 태그 (비슷한 작업을하는 것처럼 보입니다),이 태그를 가지고 있습니다 :

<annotation-driven />

이 두 태그의 차이점은 무엇입니까? 다른 "이상한"것은 이전 예제 (주석 중심 태그를 사용하지 않음)가 STS에서 Spring MVC Template 프로젝트를 사용하여 작성한 프로젝트와 매우 유사하지만 구성에서 주석 기반 태그를 삭제하면 프로젝트가 실행되지 않고 다음 오류가 발생하는 파일 : HTTP 상태 404 -

그리고 stacktrace에 내가 가지고있는 것 :

WARN : org.springframework.web.servlet.PageNotFound - 이름이 'appServlet'인 DispatcherServlet의 URI가 [/ maventestwebapp /] 인 HTTP 요청에 대한 매핑이 없습니다.

하지만 왜? 앞의 예제는 주석 중심 태그없이 잘 작동하며이 컨트롤러 클래스는 매우 유사합니다. 사실 "/"경로에 대한 HTTP 요청을 처리하는 방법은 하나뿐입니다.

이것은 내 컨트롤러 클래스의 코드입니다.

package com.mycompany.maventestwebapp;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Handles requests for the application home page.
*/
@Controller
public class HomeController {

private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

/**
 * Simply selects the home view to render by returning its name.
 */
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
    logger.info("Welcome home! The client locale is {}.", locale);

    Date date = new Date();
    DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

    String formattedDate = dateFormat.format(date);

    model.addAttribute("serverTime", formattedDate );

    return "home";
}

누군가 이걸 이해할 수있게 도와 줄 수 있니?

고마워요!

해결법

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

    1.은 실제로 XML에서 요소 묶음을 지정하거나 인터페이스를 구현하거나 기본 클래스를 확장하지 않고도 스프링 빈 의존성을 정의 할 수 있음을 의미합니다. 예를 들어 @Repository는 DaoSupport의 JpaDaoSupport 또는 다른 하위 클래스를 확장하지 않고 클래스가 Dao임을 봄에 알리기 위해 사용됩니다. 마찬가지로 @Controller는 Spring에 Controller 인터페이스를 구현하거나 컨트롤러를 구현하는 서브 클래스를 확장하지 않고 Http 요청을 처리 할 메소드를 포함하고 있다고 알려줍니다.

    은 실제로 XML에서 요소 묶음을 지정하거나 인터페이스를 구현하거나 기본 클래스를 확장하지 않고도 스프링 빈 의존성을 정의 할 수 있음을 의미합니다. 예를 들어 @Repository는 DaoSupport의 JpaDaoSupport 또는 다른 하위 클래스를 확장하지 않고 클래스가 Dao임을 봄에 알리기 위해 사용됩니다. 마찬가지로 @Controller는 Spring에 Controller 인터페이스를 구현하거나 컨트롤러를 구현하는 서브 클래스를 확장하지 않고 Http 요청을 처리 할 메소드를 포함하고 있다고 알려줍니다.

    스프링이 시작될 때 XML 설정 파일을 읽고 와 같은 것을보고 를 찾는다. 그리고 Foo는 @Controller로 마크 업되었다. 클래스가 컨트롤러로서 그것을 취급합니다. 기본적으로 Spring은 관리해야하는 모든 클래스가 beans.XML 파일에 명시 적으로 정의되어 있다고 가정합니다.

    를 사용하여 구성 요소를 검색하면 com.mycompany.maventestweapp 아래의 모든 클래스를 클래스 경로에서 검색하고 각 클래스를보고 @Controller, @Repository, @Service 또는 @Component가 있고, 그렇다면 Spring은 XML 설정에서 를 타이핑 한 것처럼 클래스를 빈 팩토리에 등록 할 것이다. 파일.

    일반적인 봄 MVC 응용 프로그램에는 Spring 컨텍스트 리스너로 시작되는 응용 프로그램 컨텍스트를 구성하는 파일 인 두 개의 스프링 구성 파일이 있다는 것을 알 수 있습니다.

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

    Spring MVC 설정 파일은 대개 Spring 디스패처 서블릿으로 시작된다. 예를 들어.

    <servlet>
            <servlet-name>main</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>main</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    

    Spring은 계층 적 빈 팩토리를 지원하므로, Spring MVC의 경우, 디스패처 서블릿 컨텍스트는 메인 애플리케이션 컨텍스트의 자식이다. 서블릿 컨텍스트에 "abc"라는 bean을 요청하면 서블릿 컨텍스트에서 먼저 찾으며, 거기서 찾지 않으면 애플리케이션 컨텍스트 인 부모 컨텍스트를 검색합니다.

    데이터 소스, JPA 구성, 비즈니스 서비스와 같은 일반적인 bean은 응용 프로그램 컨텍스트에서 정의되지만 MVC 특정 구성은 서블릿과 연관된 구성 파일이 아닙니다.

    희망이 도움이됩니다.

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

    2.

    <context:component-scan base-package="" /> 
    

    Annotation을 위해 Spring에 해당 패키지를 검사하도록 지시합니다.

    <mvc:annotation-driven> 
    

    RequestMappingHanderMapping, RequestMappingHandlerAdapter 및 ExceptionHandlerExceptionResolver를 등록하여 MVC와 함께 제공되는 @RequestMapping, @ExceptionHandler 등과 같은 주석 된 컨트롤러 메서드를 지원합니다.

    또한 Annotation 기반의 출력 포맷을 지원하는 ConversionService와 입력에 대한 Annotation 기반의 검증을 사용할 수 있습니다. 또한 JSON 데이터를 반환하는 데 사용할 수있는 @ResponseBody를 지원합니다.

    @Configuration 클래스에서 @ComponentScan (basePackages = { "...", "..."} 및 @EnableWebMvc을 사용하여 Java 기반 구성을 사용하여 동일한 작업을 수행 할 수 있습니다.

    자세한 내용은 3.1 설명서를 확인하십시오.

    http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html#mvc-config

  3. ==============================

    3.Annotation-driven은 Annotated Bean을 검색하고 XML bean 설정에만 의존하지 말아야한다는 것을 Spring에 알려줍니다. 구성 요소 검색은 해당 빈을 찾을 위치를 나타냅니다.

    Annotation-driven은 Annotated Bean을 검색하고 XML bean 설정에만 의존하지 말아야한다는 것을 Spring에 알려줍니다. 구성 요소 검색은 해당 빈을 찾을 위치를 나타냅니다.

    몇 가지 문서가 있습니다. http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-config-enable

  4. from https://stackoverflow.com/questions/13661985/spring-mvc-difference-between-contextcomponent-scan-and-annotation-driven by cc-by-sa and MIT license