关于spring和springmvc均需要引用同一配置文件的疑问

Java 小智 1259℃ 1评论

前言

在CMS系统(内容管理系统)的开发过程中,发现虽然在spring中已经引入配置文件,但是在springmvc中的仍需要引入这些配置文件,现相关内容整理如下:

疑问:
1. spring加载配置文件,创建一个上下文?父上下文?
2. spring-mvc同样需要加载配置文件,创建一个子上下文?
3. 为什么出现在spring中加载的配置文件,在springmvc中仍需要加载???

解释:
web MVC框架中,每个 DispatcherServlet 都有它自己的 WebApplicationContext ,这个 context 继承了根 WebApplicationContext 的所有bean定义。
这些继承的bean也可以在每个serlvet自己的所属的域中被覆盖(override),覆盖后的bean 可以被设置为只有这个servlet实例自己使用的属性。

springmvccontroller中,是可以@Autowire任意的bean的,这是因为他们的容器是“共享的”,但是某些属性,例如jdbc的配置属性,在controller中是无法@到的,根本原因还是springmvcspring他们的上下文是伪共享。
根据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-placeholderPropertyPlaceholderConfigurer这个类,spring才能支持@Value("${}")这种方式注入属性
2. spring或springmvc上下文中,只允许存在一个context:property-placeholder ,配置多个的话,只有第一个或生效(当然可以通过order更改加载顺序,但最终还是只有一个生效),因此若想加载多个配置文件的话,可以使用通配符* 等或者用逗号隔开多个路径,例如这样配置

<util:properties id="jdbcProperties" location="classpath:/config/*.properties,classpath:/config2/*.properties" />  

本文固定链接:心知博客 » 关于spring和springmvc均需要引用同一配置文件的疑问
本站内容除特别标注外均为原创,欢迎转载,但请保留出处!

喜欢 (7)
发表我的评论
取消评论
表情

请填写您的昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址