spring 和 springmvc 的父子容器关系浅析
来源:互联网 发布:妙笔书生精英数据论坛 编辑:程序博客网 时间:2024/04/30 07:50
问题
在工程项目中,一开始将所有的附件路径定义在工具类中。使用 static String 的形式;于是就在项目的开发过程中产生不便,也使得配置属性不灵活,不利于模块化的管理信息和提高项目的可扩展性以及维护性。因此就将项目的属性常量抽取出来,配置的属性文件中。但在此过程中产生了在@controller 注解的模块中无法加载在属性文件配置的常量。 同时也使用了@service 注解层注入常量的方法。但均已失败告终。
最后在分析了spring 和 spring mvc 的源码和属性文件之间在web中的加载顺序和相互之间的关系。解决了此问题。以下是分析解决的过程。
代码
web.xml
<display-name>demo-manager</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- 初始化spring容器 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/applicationContext-*.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!--解决post乱码--> <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- springmvc的前端控制器 --> <servlet> <servlet-name>demo-manager</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>demo-manager</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
spring-mvc.xml
<!--配置包扫描器--> <context:component-scan base-package="com.demo.controller"></context:component-scan> <!--配置注解驱动--> <mvc:annotation-driven/> <!--试图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> <!--静态资源映射--> <mvc:resources location="/WEB-INF/js/" mapping="/js/**"/> <mvc:resources location="/WEB-INF/css/" mapping="/css/**"/></beans>
application-dao.xml
<!-- 加载配置文件 --> <context:property-placeholder location="classpath:properties/*.properties"/> <!-- 数据路连接池 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <property name="driverClassName" value="${jdbc.driver}"/> <property name="maxActive" value="10"/> <property name="minIdle" value="5"/> </bean> <!-- spring管理sqlSessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!--数据库连接池--> <property name="dataSource" ref="dataSource"/> <!--加载mybatis的全局配置文件--> <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml" /> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.demo.mapper"/> </bean>
以上的配置文件可以解决@service 中@value(“${ATTPATH}’) .
同时要想解决在@controller 层中注入属性配置文件中的值,经过自己测试,存在三种方式:
1.get set 方法
(1)在@service 中 注入:
@Value("${ATT_PATH}")private String attPath;
(2)然后get set
(3)在@controller 中获取值。
2,公有化 @service中注入的值
@Value("${ATT_PATH}")public String attPath;
3.在spring-mvc.xml 中加载属性配置文件
<!-- 加载文件上传路径配置文件 解决@controller 中无法注入配置文件中的属性 --><context:property-placeholder location="classpath*:file.properties"/>
这样可以直接在@controller 中注入配置的属性文件
@Value("${ATT_PATH}")private String attPath;
关于spring 和spring MVC的父子容器关系
在web.xml 中只加载spring-mvc.xml 则是没有问题的。但是只加载spring.xml 是错误的。
spring 是父容器, springmvc 是子容器,子容器可以使用父容器的对象,但是父容器是不能使用子容器的对象的。注意,这里是对象。在实际的项目中。我们通常是在spring.xml 中加载我们在资源包下定义的属性文件的,于是,我们也只有在@service 层中通过
@value("${.....}")
的形式注入属性文件的值。若是想在@controller 中也想使用,在一般建议再在spring-mvc.xml 中在加载一次属性配置文件。 然后再@contrller 中
@value("${.....}")
发现更好的一篇文章:https://my.oschina.net/xianggao/blog/522267
- spring 和 springmvc 的父子容器关系浅析
- springmvc和spring的父子容器关系
- spring和springmvc父子容器的关系
- spring和springmvc父子容器的关系
- Springmvc和spring的父子容器关系
- spring和springmvc父子容器的关系
- spring和springmvc的父子容器关系
- Spring、SpringMVC父子容器关系浅析
- spring-Spring 和SpringMVC 的父子容器关系
- Spring和springmvc父子容器关系
- spring和springmvc父子容器关系
- Spring和SpringMVC 父子容器关系
- Spring和SpringMVC父子容器关系
- spring和springmvc的父子容器的关系
- spring和springMVC父子容器的原理
- spring和springMVC父子容器的原理
- spring和springMVC父子容器的原理
- spring和springmvc父子容器的理解
- 关于childNodes及children的区别(图文结合)
- Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
- IO输入输出
- hdu5642
- java搭建rest服务
- spring 和 springmvc 的父子容器关系浅析
- ssh免输入密码登录
- 作业调度方案
- java对日期Date类进行加减运算,年份加减,月份加减
- Android 命名规则
- sprintf 与snprintf
- insmod过程详解
- 剑指offer 20 包含min函数的栈
- 正则表达式 引用子表达式