我也是刚学spring不久,在刚照着别的项目配置完一个springmvc框架的时候,,发现在url写请求,跳转不到controller。经过百度和google后,发现我有个地方忽略了。。
就是<context:component-scan.../>的use-default-filters属性,我设置为false。因为如果不设置这个值,默认为true,就会扫描base-package属性指定的包下的所有的类。
--这个在springmvc+spring+hibernate等集成时最容易出问题的地,最典型的错误就是:事务不起作用。
这我也是在百度才知道的。
-- <context:component-scan>会交给org.springframework.context.config.ContextNamespaceHandler处理;
registerBeanDefinitionParser("component-scan", new ComponentScanBeanDefinitionParser());
-- ComponentScanBeanDefinitionParser会读取配置文件信息并组装成org.springframework.context.annotation.ClassPathBeanDefinitionScanner进行处理;
-- 如果没有配置<context:component-scan>的use-default-filters属性,则默认为true,在创建ClassPathBeanDefinitionScanner时会根据use-default-filters是否为true来调用如下代码:
protected void registerDefaultFilters() { this.includeFilters.add(new AnnotationTypeFilter(Component.class)); ClassLoader cl = ClassPathScanningCandidateComponentProvider.class.getClassLoader(); try { this.includeFilters.add(new AnnotationTypeFilter( ((Class<? extends Annotation>) cl.loadClass("javax.annotation.ManagedBean")), false)); logger.info("JSR-250 ‘javax.annotation.ManagedBean‘ found and supported for component scanning"); } catch (ClassNotFoundException ex) { // JSR-250 1.1 API (as included in Java EE 6) not available - simply skip. } try { this.includeFilters.add(new AnnotationTypeFilter( ((Class<? extends Annotation>) cl.loadClass("javax.inject.Named")), false)); logger.info("JSR-330 ‘javax.inject.Named‘ annotation found and supported for component scanning"); } catch (ClassNotFoundException ex) { // JSR-330 API not available - simply skip. }
可以看到默认ClassPathBeanDefinitionScanner会自动注册对@Component、@ManagedBean、@Named注解的Bean进行扫描。
我原本的配置只有Repositroty,和Service,少了对controller的扫描,所以才会跳不到controller。
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>