sourcecode

AbstractAnnotationConfigDispatcherServlet 확장 시 getServletConfigClasses() vs getRootConfigClasses()이니셜라이저

copyscript 2023. 9. 11. 21:58
반응형

AbstractAnnotationConfigDispatcherServlet 확장 시 getServletConfigClasses() vs getRootConfigClasses()이니셜라이저

확장할 때 vs의 차이점은 무엇입니까?오늘 아침부터 자료들을 많이 읽었지만 아직 차이점에 대해 명확한 이해를 얻지 못했습니다.

다음 두 가지 구성을 살펴보시기 바랍니다.

1).

public class SpringMvcInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {         
        return new Class[] { ConServlet.class }; 
    }
    @Override
    protected Class<?>[] getServletConfigClasses() {                      
        return null;
    }
        ....
        ....    
        }

에 대해 언급하고 있습니다.

@EnableWebMvc 
@Configuration
@ComponentScan({ "com" })
@Import({ SecurityConfig.class })
public class ConServlet {
    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/pages/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }   
}

2).

public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return null;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { WebConfig.class }; 
    }
    .....
}

WebConfig. 클래스는 다음을 참조합니다.

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "....." })
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
    }

    @Bean
    public ViewResolver viewResolver() {

        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/views");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }
}

ConServlet & WebConfig 모두 보기 초기화와 같은 작업을 수행합니다.

하지만 왜:

  • ConServlet이 반환됩니다.
  • WebConfig가 반환되는 동안

나는 그 문서를 읽었습니다.

getRootConfigClasses()getServletConfigClasses()는 모두 다음을 위한 것입니다.

제공할 @Configuration 및/또는 @Component 클래스를 지정합니다.(그들의 차이점)

  • 에 대한 루트 응용 프로그램
  • 디스패처 서블릿 응용 프로그램 컨텍스트 getServletConfigClasses()

그런데 ConServlet & WebConfig는 (보기를 초기화하는 것과 같은) 같은 작업을 하고 있는지, 아마 제가 오해를 한 것 같습니다.실제로 루트 컨텍스트와 디스패처 서블릿(이것은 알고 있습니다)이 간단한 용어/예문에 있습니다.

감사해요!

A Bit onApplicationContext계층 구조

봄의ApplicationContext는 응용프로그램 또는 중간 계층 서비스의 웹 계층과 같은 하나의 특정 계층에 각각 초점을 맞출 수 있도록 여러 개의 (일반적인) 컨텍스트를 로드할 수 있는 기능을 제공합니다.

계층 구조를 사용하는 표준 예 중 하나ApplicationContext우리가 여러 개일 때입니다.DispatcherServlet웹 애플리케이션에서 우리는 다음과 같은 일반적인 콩을 공유할 것입니다.datasources그들 사이에이 방법으로, 우리는 근을 정의할 수 있습니다.ApplicationContext모든 흔한 콩들과 여러개의 콩들을 포함하는WebApplicationContexts는 뿌리의 맥락으로부터 일반 콩을 물려받습니다.

웹 MVC 프레임워크에서, 각각DispatcherServlet고유의WebApplicationContext, 그것은 이미 뿌리에 정의된 모든 콩을 물려받습니다.WebApplicationContext. 이러한 상속된 콩은 서블릿별 범위에서 무시될 수 있으며, 주어진 범위에 대해 로컬로 새 범위별 콩을 정의할 수 있습니다.Servlet사례.

Typical context hierarchy in Spring Web MVC
Spring Web MVC의 일반적인 컨텍스트 계층 구조(Spring Documentation)

에 살고 있다면,DispatherServletworld, 단 합니다. world,이에단해의트다를는도다도는d를edrt,,ett:ot

enter image description here
Spring Web MVC의 단일 루트 컨텍스트(Spring Documentation)

말이 싸다, 암호 좀 보여주세요!

④ Spring MVC, Spring Security ⑤ Spring Data JPA ⑥ ⑦ 가정합니다 및 사용한다고 개발하고 애플리케이션을 웹 를 가정합니다 및 사용한다고 spring 웹 애플리케이션을 spring 개발하고 data spring m vc j ,이 단순한 시나리오라면 적어도 3개의 다른 구성 파일을 가질 수 있을 것입니다.WebConfig의웹련을고다든다고stsh 등 우리의 모든 웹 관련 구성을 포함합니다.ViewResolvers,Controllers,ArgumentResolvers s 과 과 등

@EnableWebMvc
@Configuration
@ComponentScan(basePackages = "com.so.web")
public class WebConfig extends WebMvcConfigurerAdapter {
    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");

        return viewResolver;
    }

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        final boolean DO_NOT_USE_SUFFIX_PATTERN_MATCHING = false;
        configurer.setUseSuffixPatternMatch(DO_NOT_USE_SUFFIX_PATTERN_MATCHING);
    }
}

를 합니다.ViewResolver나의 평범한 JSP를 해결하기 위해, 기본적으로, 형편없는 인생 결정들.우리는 필요할 것입니다.RepositoryConfig에는 , 과 을 하고 하고 등의 모든 데이터 됩니다.DataSource,EntityManagerFactory,TransactionManager 다음과 . . 과. 입니다.

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.so.repository")
public class RepositoryConfig {
    @Bean
    public DataSource dataSource() { ... }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() { ... }
    
    @Bean
    public PlatformTransactionManager transactionManager() { ... }
}

a.SecurityConfig보안에 관련된 모든 것들을 포함하고 있습니다!

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    @Autowired
    protected void configure(AuthenticationManagerBuilder auth) throws Exception { ... }

    @Override
    protected void configure(HttpSecurity http) throws Exception { ... }
}

이 모든 것들을 결합하기 위해서 우리는 두 가지 선택지가 있습니다.인 계층적째,는을할다수인다a수te할을째는인n,hlleApplicationContext을 하여, RepositoryConfig그리고.SecurityConfig근본적인 맥락에서 그리고WebConfig하위 컨텍스트에서:

public class ServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] { RepositoryConfig.class, SecurityConfig.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { WebConfig.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
}

이니까.DispatcherServlet여기에 추가할 수 있습니다.WebConfig루트 컨텍스트에 적용하고 servlet 컨텍스트를 비워 둡니다.

public class ServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] { RepositoryConfig.class, SecurityConfig.class, WebConfig.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return null;
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
}

더보기

스캐프먼은 설명을 아주 잘 했습니다.ApplicationContext매우 권장되는 이 답변의 계층 구조입니다.또한 Spring Documentation을 읽을 수 있습니다.

루트 구성 클래스는 실제로 응용 프로그램별이고 필터에 사용할 수 있어야 하는 빈을 만드는 데 사용됩니다(필터는 서블릿의 일부가 아니므로).

Servlet Config Class는 ViewResolvers, ArgumentResolvers, Interceptor 등과 같은 DispatcherServlet 고유의 Bean을 만드는 데 실제로 사용됩니다.

Root Config Classes가 먼저 로드되고 Servlet Config Classes가 로드됩니다.

Root Config Classes( 클래스)를 만듭니다.ApplicationContext에, 구성 서블릿 구성 클래스를 만듭니다. 이것은 서블릿 구성 클래스를 만듭니다.WebApplicationContext사례.

ConServlet정(Configuration),할가다e을 지정할가 없습니다.@EnableWebMvc로뿐만 아니라InternalResourceViewResolver그것들이 단지 필요한 것으로서 콩.WebConfig.

언급URL : https://stackoverflow.com/questions/35258758/getservletconfigclasses-vs-getrootconfigclasses-when-extending-abstractannot

반응형