spring-自动加载配置文件\使用属性文件注入

在上一篇jsf环境搭建的基础上 , 加入spring框架 , 先看下目录结构

src/main/resources 这个source folder 放置web项目所需的主要配置,打包时,会自动打包到WEB-INF下

首先看下pom.xml,需要引入一些依赖项:

 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 2     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 3     <modelVersion>4.0.0</modelVersion>
 4     <groupId>yjmyzz</groupId>
 5     <artifactId>jsf-web</artifactId>
 6     <version>1.0</version>
 7     <packaging>war</packaging>
 8 
 9 
10     <dependencies>
11         <!-- 单元测试 -->
12         <dependency>
13             <groupId>junit</groupId>
14             <artifactId>junit</artifactId>
15             <version>4.7</version>
16             <scope>test</scope>
17         </dependency>
18 
19         <!-- jsf -->
20         <dependency>
21             <groupId>org.jboss.spec.javax.faces</groupId>
22             <artifactId>jboss-jsf-api_2.1_spec</artifactId>
23             <version>2.1.19.1.Final-redhat-1</version>
24             <scope>compile</scope>
25         </dependency>
26 
27 
28         <!-- spring -->
29         <dependency>
30             <groupId>org.springframework</groupId>
31             <artifactId>spring-context</artifactId>
32             <version>4.0.2.RELEASE</version>
33         </dependency>
34 
35 
36         <dependency>
37             <groupId>org.springframework</groupId>
38             <artifactId>spring-web</artifactId>
39             <version>4.0.2.RELEASE</version>
40         </dependency>
41 
42 
43         <!-- servlet支持 -->
44         <dependency>
45             <groupId>javax.servlet</groupId>
46             <artifactId>servlet-api</artifactId>
47             <version>2.5</version>
48         </dependency>
49 
50     </dependencies>
51 
52     <build>
53         <plugins>
54             <plugin>
55                 <artifactId>maven-compiler-plugin</artifactId>
56                 <version>3.1</version>
57                 <configuration>
58                     <source>1.7</source>
59                     <target>1.7</target>
60                 </configuration>
61             </plugin>
62             <plugin>
63                 <artifactId>maven-war-plugin</artifactId>
64                 <version>2.3</version>
65                 <configuration>
66                     <warSourceDirectory>webapp</warSourceDirectory>
67                     <failOnMissingWebXml>false</failOnMissingWebXml>
68                 </configuration>
69             </plugin>
70         </plugins>
71     </build>
72 </project>
pom.xml

 

1. 自动加载配置文件

在web项目中,可以让spring自动加载配置文件(即上图中的src/main/resouces/spring下的xml文件),WEB-INF/web.xml中参考以下设置:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
 3      <display-name>jsf-web</display-name>
 4      
 5      <welcome-file-list>
 6        <welcome-file>index.html</welcome-file>   
 7      </welcome-file-list>
 8         
 9     <listener>
10      <listener-class>
11        org.springframework.web.context.ContextLoaderListener
12       </listener-class>
13     </listener>  
14     
15     <context-param>
16      <param-name>contextConfigLocation</param-name>
17       <param-value>
18        classpath*:spring/applicationContext-*.xml
19       </param-value>
20     </context-param>    
21 
22 </web-app>
web.xml

解释一下: classpath*:spring/applicationContext-*.xml 这里表示将加载classpath路径下 spring目录下的所有以applicationContext-开头的xml文件 , 通常为了保持配置文件的清爽 , 我们会把配置分成多份 : 比如 applicationContext-db.xml 用来配置DataSource , applicationContext-cache.xml用来配置缓存...等等.

 

2.代码中如何取得ApplicationContext实例

 1 package yjmyzz.utils;
 2 
 3 import javax.faces.context.FacesContext;
 4 import javax.servlet.ServletContext;
 5 
 6 import org.springframework.context.ApplicationContext;
 7 import org.springframework.web.context.support.WebApplicationContextUtils;
 8 
 9 public class ApplicationContextUtils {
10 
11     public static ApplicationContext getApplicationContext() {
12         ServletContext context = (ServletContext) FacesContext
13                 .getCurrentInstance().getExternalContext().getContext();
14         ApplicationContext appctx = WebApplicationContextUtils
15                 .getRequiredWebApplicationContext(context);
16 
17         return appctx;
18     }
19 
20     public static <T> T getBean(Class<T> t) {
21         return getApplicationContext().getBean(t);
22     }
23 }
ApplicationContextUtils

 有了这个工具类 , 就可以方便的取得注入的Bean

 

3. 使用properties文件注入

为了演示注入效果,先定义一个基本的Entity类

 1 package yjmyzz.entity;
 2 
 3 import java.io.Serializable;
 4 
 5 public class ProductEntity implements Serializable {
 6 
 7     private static final long serialVersionUID = -2055674628624266800L;
 8     /*
 9      * 产品编码
10      */
11     private String productNo;
12 
13     /**
14      * 产品名称
15      */
16     private String productName;
17 
18     /**
19      * 产品ID
20      */
21     private Long productId;
22 
23     public String getProductNo() {
24         return productNo;
25     }
26 
27     public void setProductNo(String productNo) {
28         this.productNo = productNo;
29     }
30 
31     public String getProductName() {
32         return productName;
33     }
34 
35     public void setProductName(String productName) {
36         this.productName = productName;
37     }
38 
39     public Long getProductId() {
40         return productId;
41     }
42 
43     public void setProductId(Long productIdLong) {
44         this.productId = productIdLong;
45     }
46 
47     @Override
48     public String toString() {
49         return productId + "/" + productNo + "/" + productName;
50     }
51 
52 }
ProductEntity

然后在applicationContext-beans.xml中配置以下内容:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="http://www.springframework.org/schema/beans
 5            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
 6 
 7     <bean id="propertyConfigurer"
 8         class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
 9         <property name="locations">
10             <list>
11                 <value>classpath:properties/*.properties</value>
12             </list>
13         </property>
14     </bean>
15 
16     <bean id="productEntity" class="yjmyzz.entity.ProductEntity">
17         <property name="productId" value="${product.id}" />
18         <property name="productNo" value="${product.no}" />
19         <property name="productName" value="${product.name}" />
20         <!-- <property name="productId">
21             <bean class="java.lang.Long">
22                 <constructor-arg index="0" value="${product.id}" />
23             </bean>
24         </property>
25          -->
26     </bean>
27 </beans>
spring配置文件

注:classpath:properties/*.properties表示运行时 , spring容器会自动加载classpath\properties目录下的所有以.properties后缀结尾的文件 ,  我们在src/main/resources/properties/下放置一个product.properties属性文件 , 内容如下:

1 product.id=3
2 product.no=n95
3 product.name=phone
product.properties

该文件被spring自动加载后 , 就可以用里面定义的属性值 , 为Bean做setter属性注入 , 即配置文件中的<property name="productId" value="${product.id}" />

 

4.验证注入是否成功

在HomeController里 ,  向Spring容器要一个Bean ,  显示下它的属性:

 1 package yjmyzz.controller;
 2 
 3 import javax.faces.bean.ManagedBean;
 4 
 5 import yjmyzz.entity.ProductEntity;
 6 import yjmyzz.utils.ApplicationContextUtils;
 7 
 8 @ManagedBean(name = "Home")
 9 public class HomeController {
10 
11     public String sayHello() {
12 
13         ProductEntity product = ApplicationContextUtils
14                 .getBean(ProductEntity.class);
15 
16         return product.toString();
17     }
18 
19 }
HomeController

index.xhtml里仍然跟上篇相同:

 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
 2 <html xmlns="http://www.w3.org/1999/xhtml"
 3       xmlns:h="http://java.sun.com/jsf/html"
 4       xmlns:f="http://java.sun.com/jsf/core"
 5       xmlns:ui="http://java.sun.com/jsf/facelets"> 
 6 
 7 <h:head>
 8     <title>jsf-web</title>
 9 </h:head> 
10 <body> 
11     <h1>
12         #{Home.sayHello()}
13         
14     </h1>
15 </body> 
16 </html>
index.xhtml

 

最后部署到jboss上 , 运行截图如下:

 

 

转载于:https://www.cnblogs.com/yjmyzz/p/3604007.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258860.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pygame碰撞检测

最近在学Pygame,花一段时间做了一个异常简陋版的"打砖块". 这次重点说一下困扰我比较长时间的碰撞检测(个人太菜..). 按照网上教程比较普遍的方法(也可能是我没看见别的),碰撞检测依次计算移动物体与被碰撞物体各个边之间坐标是否相交.例如下列代码,检测小球与窗口的…

2017-5-4 进程

进程&#xff1a;一个应用程序就是一个进程开启某个进程Process.Start("文件缩写名");通过绝对路径开启某个进程Process p new Process();p.StartInfo new ProcessStartInfo("要打开的程序绝对路径");p.Start(); 获取全部开启的进程&#xff1a;Process.…

c++分治法求最大最小值实现_程序员:算法导论,分治法、归并排序,伪代码和Java实现...

分治法我们首先先介绍分治法。分治法的思想&#xff1a;将原问题分解为几个规模较小但类似于原问题的子问题&#xff0c;递归地求解这些子问题&#xff0c;然后在合并这些子问题的解来解决原问题的解。还是拿扑克牌举例子&#xff0c;假设桌上有两堆牌面朝上的牌(牌面朝上&…

halcon相关的链接

论坛、培训 halcon学习网&#xff1a;http://www.ihalcon.com/鸟叔机器视觉&#xff1a;http://bbs.szvbt.com/forum.php 博客 韩兆新的博客园majunfuLife and Codingzhaojun的博客風韻無聲骑蚂蚁上高速的博客小马_xiaoLV2小新识图程序园-程序员的世界章柯渊的博客 注&…

python opencv图像处理程序_Python-OpenCV学习(四):基本图像处理

转载请注明出处&#xff1a;danscarlett的博客园 参考资料&#xff1a; 目录&#xff1a; 读取 imread 显示 imshow 存储 imwrite 缩放 resize 加边框 copyMakeBorder 裁剪 img[x_start:x_end,y_start:y_end] 1.图像读取&#xff1a; cv2.imread(fileName,flagsNone) 函数功能&…

分针网——怎么轻松学习JavaScript

js给初学者的印象总是那么的“杂而乱”&#xff0c;相信很多初学者都在找轻松学习js的途径。我试着总结自己学习多年js的经验&#xff0c;希望能给后来的学习者探索出一条“轻松学习js之路”。js给人那种感觉的原因多半是因为它如下的特点&#xff1a;A&#xff1a;本身知识很抽…

python时间序列分析航空旅人_用python做时间序列预测一:初识概念

利用时间序列预测方法&#xff0c;我们可以基于历史的情况来预测未来的情况。比如共享单车每日租车数&#xff0c;食堂每日就餐人数等等&#xff0c;都是基于各自历史的情况来预测的。 什么是时间序列&#xff1f; 时间序列&#xff0c;是指同一个变量在连续且固定的时间间隔上…

[Logstash-input-redis] 使用详解

2019独角兽企业重金招聘Python工程师标准>>> Redis插件参数配置详解 工作流程 logstash启动redis插件redis插件获取参数&#xff0c;进行校验工作判断监听模式(list,channel,pattern_channel等)&#xff0c;根据不同的监听模式创建监听任务创建redis实例&#xff0c…

雅可比旋转求解对称二维矩阵的特征值和特征向量

问题描述&#xff1a; 给定一个矩阵&#xff0c;如下&#xff1a; A[a11a21a12a22]A=\begin{bmatrix} a_{11}&a_{12}\\ a_{21}& a_{22} \end{bmatrix} 其中满足a12a21.也就是所谓的 对称矩阵。那么如何求解此矩阵的特征值以及特征向量呢&#xff1f;这里我们要用到 …

python画图数据的平均值怎么算的_Python气象数据处理与绘图(2):常用数据计算方法...

对于气象绘图来讲&#xff0c;第一步是对数据的处理&#xff0c;通过各类公式&#xff0c;或者统计方法将原始数据处理为目标数据。 按照气象统计课程的内容&#xff0c;我给出了一些常用到的统计方法的对应函数&#xff1a; import numpy as np 平均值 在计算气候态&#xff0…

Linux下nginx安装与配置

部分Linux发布版的默认安装已经集成了nginx&#xff0c;查看方法ls /usr/local&#xff0c;若已有nginx文件夹说明已集成。nginx依赖库pcre与zlib&#xff0c;且pcre依赖于gcc与gcc-c&#xff0c;因此安装步骤为&#xff1a;安装gcc与gcc-c库安装pcre库安装zlib库安装nginx详细…

几种字符串加密解密的方法

为什么80%的码农都做不了架构师&#xff1f;>>> 第一种&#xff1a;〔 Python 与 Bash Shell 的结合 〕 这个命令会让你输入一个字符串&#xff0c;然后会再输出一串加密了的数字。 加密代码[照直输入]: python -c print reduce(lambda a,b: a*256ord(b), raw_inpu…

java delegate怎么写_美团面试官:你说你们公司的Mybatis分页插件是你写的,给我说说它的设计原理?...

来源&#xff1a;http://my.oschina.net/zudajun大多数框架&#xff0c;都支持插件&#xff0c;用户可通过编写插件来自行扩展功能&#xff0c;Mybatis也不例外。我们从插件配置、插件编写、插件运行原理、插件注册与执行拦截的时机、初始化插件、分页插件的原理等六个方面展开…

SharePoint 2013 处理videoplayerpage.aspx下的个人图片显示有误问题

问题&#xff1a;Personal sites photo cant correct display in the videos pageThe url address of personal sites photo is exist surplus characters. The correct situation is just the characters of "%20", not the characters of "%2520".解决方…

clover引导mbr安装黑苹果_安装黑苹果记录(一)

从来没有接触过macOS(苹果系统)&#xff0c;孩子说他用的那台电脑linux不能安装一些软件&#xff0c;问我能不能安装黑苹果&#xff0c;一些软件只有win和mac的客户端&#xff0c;却没有linux版本。他知道我不会给他安装Windows&#xff0c;一个是怕他玩游戏&#xff0c;另外一…

doxygen问题集锦

使用doxygen排版数学公式出错的解决方法 参考&#xff1a;http://blog.csdn.net/huangbo10/article/details/46801949 问题 今天玩了一下doxygen&#xff0c;碰到一个问题 ! Undefined control sequence. l.77 $ y_{\mbox{test}} \mathbb{E}[y_{\mbox{train}}] x $ ? !…

ubuntu中make头文件找不到_和平精英:游戏中找不到人怎么办?这些技巧帮你练出“火眼金睛”...

大家好&#xff0c;欢迎来到《刺激实战教室》&#xff0c;我是你们的老朋友刺激哥。俗话说&#xff0c;电子竞技不需要视力&#xff0c;而这句话也是《和平精英》的一个“痛点”。在《和平精英》这款游戏中&#xff0c;更是如此。在很多时候&#xff0c;敌人就藏在我们的附近&a…

eureka配置_F版本SpringCloud 5—Eureka集群和自我保护机制

源码地址&#xff1a;https://gitee.com/bingqilinpeishenme/Java-Tutorials前言上篇文章中&#xff0c;通过代码搭建了Eureka注册中心和客户端&#xff0c;是Eureka的简单应用&#xff0c;在本文中将会讲解更多关于Eureka服务端的应用以及原理。Eureka 自我保护机制进入自我保…

windows共享内存

在windows编程中避免不了使用共享内存&#xff0c;因为他是进程间通信、文件读取最简单的方式&#xff0c;有书上还说其他进程间通讯机制如管、油槽、WM_COPYDATA底层也是用的共享内存机制。关于使用方法还是请参考MSDN。 最近听说使用共享内存不安全&#xff0c;可能会被其他进…

Chrome指令/追踪Http请求相关

2019独角兽企业重金招聘Python工程师标准>>> Chrome HTTP抓包&#xff0c;在地址栏输入 chrome://net-internals/#requests转载于:https://my.oschina.net/u/2292141/blog/895603