不同于我们讲的pom.xml以及web.xml,这两个文件的名称是固定的,不可更改的,这里的设计采用的是约定优于配置的原则。
而Spring的配置文件的名称是可以更改的,实际上我们在《Spring项目实践(二)---web.xml文件详解 》中已经给Spring的配置文件命名过了:
contextConfigLocation
/WEB-INF/spring-*.xml
这里为什么我们要使用一个匹配符呢?
其实我们也可以使用唯一的一个文件,但是这样的话,所有的配置都堆在一起,不容易查找和更改。
通常我们根据不同的业务或者功能,会区分出来几个不同的配置文件,例如:
spring-common.xml:用来存放通用的配置
spring-mybatis.xml:用来存放数据库相关的配置
spring-shiro.xml:用来存放shiro相关的配置
跟之前的文章一样,我们还是一步步的来说明:
一.头部beans部分
pom.xml使用project作为root标签,web.xml使用web-app作为root标签,而spring的配置文件使用beans作为root标签。
这部分有点意思。
先说结论吧:自动扫描包括了注解装配,也就是说,如果你使用了
如果你非要两个都配置,也没有关系,系统会忽略注解装配,直接认为你使用了自动扫描
那么这两者的作用究竟是什么呢?
举例来说明:我们有类A,B和C。其中A使用了B和C的实例,我们采用依赖注入的方式来给A注入BC的实例。
如果没有注解装配和自动扫描的话,我们的代码应该是这样的:
public Class A{
private B b;
private C c;
A(){
printf("create A");
}
void setB(B b){
printf("create B");
this.b = b;
}
void setC(C c){
printf("set C instance");
this.c = c;
}
}
public Class B{
B(){
printf("create B");
}
}
public Class C{
C(){
printf("create C");
}
}
create B
create C
create A
set B instance
set C instance
而如果使用注解装配,我们会这么写:
package com.xxx;
public Class A{
private B b;
private C c;
A(){
printf("create A");
}
@Autowired
void setB(B b){
printf("set B instance");
this.b = b;
}
@Autowired
void setC(C c){
printf("set C instance")
this.c = c;
}
}
package com.xxx;
public Class B{
B(){
printf("create B");
}
}
package com.xxx;
public Class C{
C(){
printf("create C");
}
}
create B
create C
create A
可以看到,使用注解装配,我们就不需要在配置文件里面指定bean的参数了
但是现在,我觉得在配置文件里面写bean也很麻烦,这个时候就轮到自动扫描登场了。
package com.xxx;
@Component
public Class A{
private B b;
private C c;
A(){
printf("create A");
}
@Autowired
void setB(B b){
printf("set B instance");
this.b = b;
}
@Autowired
void setC(C c){
printf("set C instance")
this.c = c;
}
}
package com.xxx;
@Component
public Class B{
B(){
printf("create B");
}
}
package com.xxx;
@Component
public Class C{
C(){
printf("create C");
}
}
另外补充一个进阶知识:
为什么不去扫描Controller的实现类呢?
是因为上面的配置文件,是spring的。
而对Controller的扫描,实际上是springmvc的任务,所以我们通常会在springmvc的配置文件里面加上:
注意,这里不是exclude,而是include。
三.bean部分
是不是使用了自动扫描,就不需要在配置文件里面写bean了?
当然不是,因为自动扫描只能扫描你自己的包和类,对于第三方的,尤其是spring自带的,我们还是需要配置一下的。
下面列出来几个经常用到的bean
1.PropertyPlaceholderConfigurer
这个bean的作用是:允许我们使用属性配置文件.properties
关于.properties文件,其实我们在讲pom.xml的时候就遇到过了,你可以使用.properties文件,来定义一些键值对,针对不同的开发环境,配置不同的参数。
在pom中,我们使用.properties来定义开发环境和生产环境不同的编译参数。
在spring中,我们经常使用.properties来定义开发环境和生产环境不同的数据库参数。
比如mybatis的配置:
profile.jdbc.driver=com.mysql.jdbc.Driver
profile.jdbc.url=jdbc:mysql://localhost:3306/xxx?characterEncoding=utf-8&autoReconnect=true
profile.jdbc.username=root
profile.jdbc.password=
classpath:common.properties
classpath:jdbc.properties