配置
配置
这边的配置文件,主要是指spring的配置文件.
website或者boot,是一定会给源码的,这2个工程是负责spring启动的.需要弄清楚spring到底加载了哪些东西.
applicationContext.xml
无论是website工程还是boot工程,都会使用main/resources/applicationContext.xml加载spring,不同的地方在于,website工程会通过applicationContext加载datasource和transaction,boot不会,boot项目的datasource是通过application-druid.yml配置加载.
applicationContext加载spring的配置文件列表,这边的spring配置文件基本都在main/resources/spring目录下.
| 文件名 | 说明 |
|---|---|
| spring-datasource.xml | 配置应用的datasource,不可改 一个应用只连接一个DB 推荐使用JNDI,直接配置用户名密码会有安全隐患 |
| spring-transaction | 配置应用的事务,不可改 同时注册transactionManager和transactionTemplate |
| spring-security | 配置登录的安全策略,现场技术人员可以修改内部的实现,实现自定义的开发.详细请看安全 |
| spring-mybatis | 配置应用的mybatis的各种策略 |
| spring-task | 配置应用内部的定时任务,详细请看autoTask. |
| export-template | 配置应用使用到的超级导出的字段匹配,详细请看超级导出 |
| spring-property.xml | 配置应用程序使用的K-V属性配置. |
| cache/cache-ehcache.xml | 配置应用程序的缓存,可以更换缓存实现,切换spring配置文件即可,详细请看缓存 |
springMVC配置
dispatcher-servlet.xml是website提供给springMVC加载的web资源的配置.spring-mvc.xml是boot项目提供给springMVC的配置. 2个配置文件大同小异.dispatcher-servlet比spring-mvc多加载了一个spring-property和fastjson的messageConverter.
除了上述的差别,springMVC配置主要加载如下内容
| 组件类型 | 名称 | 说明 |
|---|---|---|
| controller | controller扫描 | 需要应用程序扫描多少文件夹,加载多少controller |
| resolver | multipartResolver | 配置文件上传解析器 |
| resolver | localResolver | 国际化参数的存储解析配置 |
| resolver | viewResolver | 页面解析器,使用velocity进行页面解析 为了可以让spring更换版本,这边重写了spring-velocity |
| interceptor | 资源拦截器 | 允许应用从classpath的static文件夹内加载静态资源 |
| interceptor | LocaleChangeInterceptor | 感知用户切换国际化语言的变更 |
| interceptor | AuthorizationInterceptor | 登录授权鉴权拦截器,详细请看安全 |
| aspect | SecurityCheckerAspect | controller权限检查,拦截@SecurityCheck注解 |
| aspect | OperLogAspect | 记录用户操作轨迹,拦截@OpLog注解 |
| aspect | ExporterAspect | 导出拦截,拦截@Export注解,详细请看超级导出 |
属性配置
通常我们认为的配置主要有如下几种类型
| 类型 | 举例 | 解决方式 |
|---|---|---|
| 环境配置 | 数据库的url,用户名密码 | 使用properties或者apollo |
| 系统初始配置 | 登录标识存储,登录跳转url | 使用properties |
| 运行时配置 | 因为业务需要,关闭当前系统的登录功能 | 数据库配置 |
property配置
通常我们认为,可执行包+配置文件=运行环境,而对于可执行包而言,应该是一次编译,多次部署,通过对不同环境的配置文件的适配,可以部署在不同的环境上.所以我们更加推荐把配置文件放在可执行包的外面,由外面来进行控制
在spring-property.xml中,我们配置了几个系统启动会加载的属性文件
<bean id="propertyConfigurer" class="com.istock.base.spring.dynamicLoad.PropertyStaticLoader" factory-method="getInstance">
<property name="locations">
<list>
<value>classpath*:config/*.properties</value>
<!-- 推荐使用文件方式访问配置文件 -->
<value>file:/apps/config/new-user/*.properties</value>
</list>
</property>
<!-- apollo的集成配置 -->
<property name="apolloNamespace" value="application,senvon"></property>
</bean>警告
如果配置项有重复,apollo>配置文件
如果locations的配置文件中的配置项有重复,后加载的配置项会覆盖先加载的配置项,简单来说,就是后面的会覆盖前面的.
提示
classpath的属性配置,主要作用于IDE启动jvm的时候,maven生成src/test/resources文件夹会默认加载到当前的classLoader,这个时候,file的本地文件可以不存在,JVM会使用src/test/resources的配置进行启动
src/test/resources这个文件夹在执行maven package命令的时候,又不会被打进发布包,所以,一旦上环境,不管的测试环境还是生产环境,都会使用外部配置文件.
注意
有些框架使用maven打包时候的resources标签进行替换,这种方式最终配置文件是在可执行包内,一旦换了一个环境,需要手动替换可执行包内的配置信息,非常不靠谱,也不能使用jenkins进行自动化部署.另外这种发包方式,因为适配了生产环境,而生产环境又在可执行包内,这个可执行包无法在环境之外的测试环境运行,会导致"生产的包没有经过测试"的悖论.
