2015-03-10 3 views
2

Я следующий учебник о Spring MVC, и я не могу понять что-то о @ComponentScan аннотацию, даже если я прочитал весной API док, так вот пример кодаКак понять Spring @ComponentScan

Настройка View Controllers

package com.apress.prospringmvc.bookstore.web.config; 
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; 
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 
// Other imports ommitted 
@Configuration 
@EnableWebMvc 
@ComponentScan(basePackages = { "com.apress.prospringmvc.bookstore.web" }) 
public class WebMvcContextConfiguration extends WebMvcConfigurerAdapter { 
    // Other methods ommitted 
    @Override 
    public void addViewControllers(final ViewControllerRegistry registry) { 
     registry.addViewController("/index.htm").setViewName("index"); 
    } 
} 

аннотаций на основе Контроллеры

package com.apress.prospringmvc.bookstore.web;  
import org.springframework.stereotype.Controller;  
import org.springframework.web.bind.annotation.RequestMapping;  
import org.springframework.web.servlet.ModelAndView;  
@Controller  
public class IndexController {  
@RequestMapping(value = "/index.htm")  
    public ModelAndView indexPage() {  
     return new ModelAndView(“index");  
    }  
}  

Мой вопрос:

для просмотра контроллерах, добавив
@Configuration и
@ComponentScan (basePackages = { "com.apress.prospringmvc.bookstore.web"}) , что будет сделано в фоновом режиме ? будет ли пакет com.apress.prospringmvc.bookstore.web предлагать что-то для этих контроллеров представления?

ответ

9

Проще говоря - @ComponentScan сообщает Spring, в каких пакетах у вас есть аннотированные классы, которыми должен управлять Spring. Так, например, если у вас есть класс, аннотированный с @Controller, который находится в пакете, который не проверяется весной, вы не сможете использовать его в качестве контроллера Spring.

Классы, аннотированные @Configuration, являются новыми способом настройки Spring с использованием аннотаций вместо XML-файлов (это называется конфигурацией Java). Весна должна знать, какие пакеты содержат весенние бобы, иначе вам придется регистрировать каждый компонент по отдельности. Для этого используется @ComponentScan.

В вашем примере вы указываете Spring, что пакет com.apress.prospringmvc.bookstore.web содержит классы, которые должны обрабатываться весной. Spring затем находит класс, аннотированный с помощью @Controller, и обрабатывает его, что приводит к тому, что все запросы, поступающие на /index.htm, перехватываются контроллером.

Когда запрос перехвачен, Spring должен знать, какой ответ отправить отправителю. Поскольку вы возвращаете экземпляр ModelAndView, он попытается найти в вашем проекте представление (страница JSP) под названием index (подробности об этом зависят от настроенных разрешений вида) и передает его пользователю.

Если @Controller аннотации не было или этот пакет не был отсканирован весной, все это было бы невозможно.

+0

так что для моего примера, что, если я удалю @ComponentScan(), моя программа больше не будет работать, потому что у него недостает каких-то бобов или что-то еще? –

+1

Да, ваш 'IndexController' не будет функционировать. –

+0

Кажется более понятным, чем сейчас, но не 100%. Могу ли я попросить вас объяснить отношения между этими двумя классами? Как подключить представление, «/index.htm» и контроллер. –

Смежные вопросы