轉自http://blog.csdn.net/caolaosa...
如今經常使用框架中SpringMVC.xml配置是:<mvc:annotation-driven/>
和<context:component-scan>
那麼<context:annotation-config/>
呢?
首先看一下三個註解各自定義:java
<context:annotation-config/>
@Autowired
註解,那麼就必須事先在 spring 容器中聲明 AutowiredAnnotationBeanPostProcessor Bean.@Resource
,@PostConstruct
,@PreDestroy
等註解就必須聲明CommonAnnotationBeanPostProcessor@PersistenceContext
註解,就必須聲明PersistenceAnnotationBeanPostProcessor的Bean.@Required
的註解,就必須聲明RequiredAnnotationBeanPostProcessor的Bean.使用<context:annotation- config/>
隱式地向 Spring容器註冊這4個BeanPostProcessor :web
AutowiredAnnotationBeanPostProcessor RequiredAnnotationBeanPostProcessor CommonAnnotationBeanPostProcessor PersistenceAnnotationBeanPostProcessor
即<context:annotation-config/>
是用來使上述註解起做用的,也就是說激活已經在application context中註冊的bean.
之因此這樣說是由於<context:annotation-config/>
僅可以在spring容器中已經註冊過的bean上面起做用.對於沒有在spring容器中註冊的bean,它並不能執行任何操做,也就是說若是你並無spring容器中註冊過bean(spring配置文件中配置bean就是註冊),那麼上述的那些註解並不會在你未註冊過的bean中起做用.spring
<context:component-scan>
<context:component-scan>
作了<context:annotation-config>
要作的事情,還額外支持@Component
,@Repository
,@Service
,@Controller
註解.而且<context:component-scan>
掃描base-package而且在applicationcontext中註冊掃描的beans.mvc
因此配置<context:component-scan>
就不須要配置<context:annotation- config/>
app
<mvc:annotation-driven/>
至於該項看前綴就應該知道是springmvc所須要的註解.框架
<mvc:annotation-driven/>
至關於註冊了DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter兩個bean,配置一些messageconverter.即解決了@Controller
註解的使用前提配置.ui
咱們找到對應的實現類是:url
org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser.
經過閱讀類註釋文檔,咱們發現這個類主要是用來向工廠中註冊了.net
RequestMappingHandlerMapping BeanNameUrlHandlerMapping RequestMappingHandlerAdapter HttpRequestHandlerAdapter SimpleControllerHandlerAdapter ExceptionHandlerExceptionResolver ResponseStatusExceptionResolver DefaultHandlerExceptionResolver
上面幾個Bean實例.這幾個類都是用來作什麼的呢?code
前兩個是HandlerMapping接口的實現類,用來處理請求映射的.
@RequestMapping
註解的.中間三個是用來處理請求的.具體點說就是肯定調用哪一個controller的哪一個方法來處理當前請求.
理@Controller
註解的處理器,支持自定義方法參數和返回值(很酷).後面三個是用來處理異常的解析器.
另外還將提供如下支持:
① 支持使用ConversionService實例對錶單參數進行類型轉換;
② 支持使用@NumberFormatannotation,@DateTimeFormat註解完成數據類型的格式化;
③ 支持使用@Valid註解對Java bean實例進行JSR 303驗證;
④ 支持使用@RequestBody和@ResponseBody註解
轉自:http://blog.csdn.net/sunhuwh/...<annotaion-driven/>
標籤:這個標籤對應的實現類是org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser
仔細閱讀它的註釋文檔能夠很明顯的看到這個類的做用.解析這個文檔:
這個類主要註冊8個類的實例:
1.RequestMappingHandlerMapping 2.BeanNameUrlHandlerMapping 3.RequestMappingHandlerAdapter 4.HttpRequestHandlerAdapter 5.SimpleControllerHandlerAdapter 6.ExceptionHandlerExceptionResolver 7.ResponseStatusExceptionResolver 8.DefaultHandlerExceptionResolver
1是處理@RequestMapping註解的,2.將controller類的名字映射爲請求url.1和2都實現了HandlerMapping接口,用來處理請求映射.
3是處理@Controller註解的控制器類,4是處理繼承HttpRequestHandlerAdapter類的控制器類,5.處理繼承SimpleControllerHandlerAdapter類的控制器.因此這三個是用來處理請求的.具體點說就是肯定調用哪一個controller的哪一個方法來處理當前請求.
6,7,8所有繼承AbstractHandlerExceptionResolver,這個類實現HandlerExceptionResolver,該接口定義:接口實現的對象能夠解決處理器映射,執行期間拋出的異常,還有錯誤的視圖.
因此<annotaion-driven/>
標籤主要是用來幫助咱們處理請求映射,決定是哪一個controller的哪一個方法來處理當前請求,異常處理.
<context:component-scan/>
標籤:它的實現類是org.springframework.context.annotation.ComponentScanBeanDefinitionParser.
把鼠標放在context:component-scan
上就能夠知道有什麼做用的,用來掃描該包內被@Repository
,@Service
,@Controller
的註解類,而後註冊到工廠中.而且context:component-scan
激活@required
,@resource
,@autowired
,@PostConstruct
,@PreDestroy
,@PersistenceContext
,@PersistenceUnit
.使得在適用該bean的時候用@Autowired
就好了.