mvc:annotation-driven和context:component-scan区别
1. < mvc:annotation-driven/>
< mvc:annotation-driven/>相当于注册了DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter 两个bean,配置一些messageconverter。即解决了@Controller注解的使用前提配置。
这个标签对应的实现类是org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser
这个类主要注册8个类的实例,主要是用来帮助我们处理请求映射,决定是哪个controller的哪个方法来处理当前请求,异常处理。
在spring中一般采用@RequestMapping注解来完成映射关系,要向使@RequestMapping注解生效,必须向上下文中注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter实例,这两个实例分别在类级别和方法级别处理,而annotation-driven配置帮助我们自动完成上述两个实例的注入。
2. < context:annotation-config/>
< context:annotation-config/>是对包进行扫描,实现注释驱动Bean定义,同时将bean自动注入容器中使用。
它的实现类是org.springframework.context.annotation.ComponentScanBeanDefinitionParser.
把鼠标放在context:component-scan上就可以知道有什么作用的,用来扫描该包内被@Repository @Service @Controller的注解类,然后注册到工厂中。并且context:component-scan激活@ required。@ resource,@ autowired、@PostConstruct @PreDestroy @PersistenceContext @PersistenceUnit。使得在适用该bean的时候用@Autowired就行了。
总结
context:component-scan 只做扫描注解包下bean的工作,让bean生效。在这个基础上配置jsp的视图解析其实就可以正常访问jsp视图。
但是这时候,你无法实现如接收返回json数据、参数验证、统一异常等控制器(或者业务层)的功能。
mvc:annotation-driven/ 标签的作用就在于此,注册HandlerMapping和HandlerAdapter两个bean。