前言
在CMS系统(内容管理系统)的开发过程中,发现虽然在spring
中已经引入配置文件,但是在springmvc
中的仍需要引入这些配置文件,现相关内容整理如下:
疑问:
1. spring加载配置文件,创建一个上下文?父上下文?
2. spring-mvc同样需要加载配置文件,创建一个子上下文?
3. 为什么出现在spring中加载的配置文件,在springmvc中仍需要加载???
解释:
在web MVC
框架中,每个 DispatcherServlet
都有它自己的 WebApplicationContext
,这个 context
继承了根 WebApplicationContext
的所有bean
定义。
这些继承的bean
也可以在每个serlvet
自己的所属的域中被覆盖(override
),覆盖后的bean
可以被设置为只有这个servlet
实例自己使用的属性。
在springmvc
的controller
中,是可以@Autowire
任意的bean
的,这是因为他们的容器是“共享的”,但是某些属性,例如jdbc
的配置属性,在controller
中是无法@
到的,根本原因还是springmvc
和spring
他们的上下文是伪共享。
根据UCM的思想,任意属性在任何地方都是可以被@
到的,那如何在springmvc
中去@
某个配置属性呢?
在spring和springmvc中同时定义属性配置文件
方法一:
就是在springmvc和spring的xml配置文件中都把属性文件引入一遍,这样springmvc和spring就是各用各的,如果后期有修改,两个地方都需要修改。
springcontext.xml中加入:
<context:property-placeholder location="classpath:/config/jdbc.properties" />
springmvc.xml中加入:
<context:property-placeholder location="classpath:/config/jdbc.properties" />
在代码中,可以这样@需要的属性配置
@Value("${jdbc.username}") private Stringusername;
此法虽好,但是同样的代码写两份,总是不够完美。
其实若想只加载一份就在两个地方使用,那就需要将配置文件的加载分成两步来操作。在spring
中,PropertiesFactoryBean
可以将多个properties
文件加载为一个bean
(本质上时一个hashtable
),而context:property-placeholder
又支持引用某个配置bean
,因此可以采取如下方法来加载properties
文件。
在springmvc中使用spring定义的属性
方法二:
在springcontext.xml中加入
<!-- 配置文件加载器 --> <beanid="applicationProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> <property name="ignoreResourceNotFound" value="true" /> <property name="locations"> <list> <value>classpath:/config-base/*.properties</value> <value>classpath:/config/*.properties</value> </list> </property> </bean> <!-- 引用配置文件加载器,并使支持${}的形式 --> <context:property-placeholder properties-ref="applicationProperties" />
springmvc.xml中加入:
<!-- 引用配置文件加载器,并使支持${}的形式 --> <context:property-placeholderproperties-ref="applicationProperties" />
这样就可以在任何controller或service中@
我们需要的属性了。
拓展:
1. context:property-placeholder
的实现类是 PropertyPlaceholderConfigurer
,而且只有配置了context:property-placeholder
或PropertyPlaceholderConfigurer
这个类,spring才能支持@Value("${}")
这种方式注入属性
2. spring或springmvc上下文中,只允许存在一个context:property-placeholder
,配置多个的话,只有第一个或生效(当然可以通过order更改加载顺序,但最终还是只有一个生效),因此若想加载多个配置文件的话,可以使用通配符*
等或者用逗号隔开多个路径,例如这样配置
<util:properties id="jdbcProperties" location="classpath:/config/*.properties,classpath:/config2/*.properties" />
本文固定链接:心知博客 » 关于spring和springmvc均需要引用同一配置文件的疑问
本站内容除特别标注外均为原创,欢迎转载,但请保留出处!