转自:http://www.cnblogs.com/benwu/articles/5162614.html

Spring MVC项目中通常会有二个配置文件,sprng-servlet.xml和applicationContext.xml二个配置文件,通常会出现以下几个配置

  1. <context:annotation-config />

  它的作用是隐式地向 Spring 容器注册  AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor、RequiredAnnotationBeanPostProcessor 这4个BeanPostProcessor。其作用是如果你想在程序中使用注解,就必须先注册该注解对应的类,如下图所示:

依赖的类 注解
CommonAnnotationBeanPostProcessor @Resource 、@PostConstruct、@PreDestroy
PersistenceAnnotationBeanPostProcessor的Bean @PersistenceContext
AutowiredAnnotationBeanPostProcessor Bean @Autowired
RequiredAnnotationBeanPostProcessor @Required

  当然也可以自己进行注册:

<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:

<context:property-placeholder ignore-unresolvable="true" location="classpath:/application.properties" />
 
 

输出:

 Loading properties file from class path resource [application.properties]
 
 

第二种配置: classpath*:

 <context:property-placeholder ignore-unresolvable="true"  location="classpath*:/application.properties"
 
输出:
Loading properties file from URL [file:/D:/workspace_sun/framework-dev/micmiu-demoweb/target/test-classes/application.properties]
Loading properties file from URL [file:/D:/workspace_sun/framework-dev/micmiu-demoweb/target/classes/application.properties]
Loading properties file from URL [jar:file:/D:/micmiu-test.jar!/application.properties]
 
 

由此日志信息可知:

  • 同名资源存在时,classpath: 只从第一个符合条件的classpath中加载资源,而classpath*: 会从所有的classpath中加载符合条件的资源
  • classpath*:需要遍历所有的classpath,效率肯定比不上classpath,因此在项目设计的初期就尽量规划好资源文件所在的路径,避免使用classpath*来加载

最新文章

  1. c# 强制转换, 隐式转换, 显式转换
  2. VRP
  3. MySQL绿色版安装(mysql-5.7.12-win32)
  4. ContentProvider官方教程(3)ContentResolver查询、遍历 示例
  5. Link Collecting
  6. JMeter二次开发(2)-编写 JSON Assertion 插件
  7. 【Reorder List】cpp
  8. 【BZOJ】【1019】【SHOI2008】汉诺塔
  9. jQuery Mobile入门教程
  10. Pahom on Water(最大流)
  11. CFround#380 div2
  12. gerrit的merge conflict
  13. linux三剑客之sed命令
  14. js获取设备
  15. verilog仿真文件编写
  16. Nginx(十)-- 进程模型及工作原理
  17. Handler,Looper,HandlerThread浅析
  18. MySQL抓包工具:MySQL Sniffer 和性能优化
  19. Django - CBV、FBV
  20. 利用ChainMap进行多字典合并

热门文章

  1. mysql 7.5.8 服务无法启动 服务没有报告任何错误
  2. iOS AVPlayer 学习
  3. 10个超有趣的linux命令
  4. Why does typeof array with objects return “Object” and not “Array”?
  5. springboot 配置过滤器
  6. 如何使用REST请求风格
  7. HBase协处理器的使用(添加Solr二级索引)
  8. NLP-特征选择
  9. 利用RandomAccessFile类在指定文件指定位置插入内容
  10. svg_path