Spring MVC項目中通常會有二個配置文件,sprng-servlet.xml和applicationContext.xml二個配置文件,
前者主要是用來實現mvc的,后者主要是用來實現ioc的,后者的配置文件中通常有一下幾個節點:
1. <context:annotation-config />
它的作用是隱式地向 Spring 容器注冊 AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor、RequiredAnnotationBeanPostProcessor 這4個BeanPostProcessor。其作用是如果你想在程序中使用注解,就必須先注冊該注解對應的類,如下圖所示:
依賴的類 | 注解 |
CommonAnnotationBeanPostProcessor | @Resource 、@PostConstruct、@PreDestroy |
PersistenceAnnotationBeanPostProcessor的Bean | @PersistenceContext |
AutowiredAnnotationBeanPostProcessor Bean | @Autowired @Value |
RequiredAnnotationBeanPostProcessor | @Required |
ConfigurationClassPostProcessor
|
@Configuration |
EventListenerMethodProcessor
|
@EventListener |
當然也可以自己進行注冊:
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor "/> <bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"/>
2. <context:component-scan base-package="com.*" >
<context:component-scan/> 配置項不但啟用了對類包進行掃描以實施注釋驅動 Bean 定義的功能,同時還啟用了注釋驅動自動注入的功能(即還隱式地在內部注冊了 AutowiredAnnotationBeanPostProcessor 和 CommonAnnotationBeanPostProcessor),因此當使用 <context:component-scan/> 后,就可以將 <context:annotation-config/> 移除了。
在這里有一個比較有意思的問題,就是掃描是否需要在二個配置文件都配置一遍,我做了這么幾種測試:
(1)只在applicationContext.xml中配置如下
<context:component-scan base-package="com.login" />
掃描到有@RestController、@Controller、@Compoment、@Repository等注解的類,則把這些類注冊為Bean。
啟動正常,但是任何請求都不會被攔截,簡而言之就是@Controller失效
(2)只在spring-servlet.xml中配置上述配置
啟動正常,請求也正常,但是事物失效,也就是不能進行回滾
(3)在applicationContext.xml和spring-servlet.xml中都配置上述信息
啟動正常,請求正常,也是事物失效,不能進行回滾
(4)在applicationContext.xml中配置如下
<context:component-scan base-package="com.login" />
在spring-servlet.xml中配置如下
<context:component-scan base-package="com.sohu.login.web" />
此時啟動正常,請求正常,事物也正常了。
結論:在spring-servlet.xml中只需要掃描所有帶@Controller注解的類,在applicationContext中可以掃描所有其他帶有注解的類(也可以過濾掉帶@Controller注解的類)。
詳解 http://blog.csdn.net/gladmustang/article/details/39999721
3. <mvc:annotation-driven />
它會自動注冊RequestMappingHandlerMapping 與RequestMappingHandlerAdapter ( 3.1 以后DefaultAnnotationHandlerMapping 和AnnotationMethodHandlerAdapter已經可以不用了)
http://www.cnblogs.com/yangzhilong/p/3725849.html
http://stackoverflow.com/questions/19896870/why-is-my-spring-autowired-field-null
官方文檔: http://docs.spring.io/spring/docs/4.2.2.BUILD-SNAPSHOT/spring-framework-reference/htmlsingle/#beans-autowired-annotation
區別: http://my.oschina.net/HeliosFly/blog/205343
spring中classpath和classpath*的配置區別
我們以spring中加載properties資源文件為例講解,目錄結構大致如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
src
├─
main
│
├─filters
│
│
│
├─java
│
│ └─com
│
│ └─micmiu
│
│ ├─demoweb
│
│ │ │ ....
│
│ │ │
│
│ │ └─utils
│
│ │
│
│ └─modules
│
│
│
├─resources
│
│ │ application.properties
│
│ │ applicationContext-shiro.xml
│
│ │ applicationContext.xml
│
│ │ hibernate.cfg.xml
│
│ │ log4j.properties
│
│ │ spring-mvc.xml
│
│ │ spring-view.xml
│
│
│
└─webapp
│
│
│
└─WEB-INF
│
└─
test
├─java
│ └─com
│ └─micmiu
│ ├─demoweb
│ │ TestOther.java
│
└─resources
application.properties
|
同時 在該項目的lib中添加一個測試的micmiu-test.jar包,jar包中的文件結構如下:
1
2
3
4
5
6
7
8
9
10
11
|
micmiu-test.jar
│
application.properties
│
├─
com
│
└─micmiu
│
└─test
│
application.properties
│
RunApp.class
│
└─
META-INF
MANIFEST.MF
|
從准備的測試環境中我們可以看到在不同目錄下的四個同名的application.properties資源文件。
[二]、測試代碼:TestClassPath.java
1 package com.micmiu.demoweb; 2 3 import org.springframework.context.ApplicationContext; 4 import org.springframework.context.support.ClassPathXmlApplicationContext; 5 6 public class TestClassPath { 7 public static void main(String[] args) { 8 ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:/applicationContext.xml"); 9 System.out.println(ctx.getClassLoader().getResource("").getPath()); 10 } 11 }
spring配置文件:applicationContext.xml 中兩種不同的properties文件加載配置:
第一種配置:classpath:
第二種配置: classpath*:
由此日志信息可知:
- 同名資源存在時,classpath: 只從第一個符合條件的classpath中加載資源,而classpath*: 會從所有的classpath中加載符合條件的資源
- classpath*:需要遍歷所有的classpath,效率肯定比不上classpath,因此在項目設計的初期就盡量規划好資源文件所在的路徑,避免使用classpath*來加載