??xml version="1.0" encoding="utf-8" standalone="yes"?> Spring可以通过指定classpath*:与classpath:前缀加\径的方式从classpath加蝲文g,如bean的定义文?classpath*:的出现是Z(jin)从多个jar文g中加载相同的文g.classpath:只能加蝲扑ֈ的第一个文? 比如 resource1.jar中的package 'com.test.rs' 有一?'jarAppcontext.xml' 文g,内容如下: <bean name="ProcessorImplA" class="com.test.spring.di.ProcessorImplA" /> resource2.jar中的package 'com.test.rs' 也有一?'jarAppcontext.xml' 文g,内容如下: <bean id="ProcessorImplB" class="com.test.spring.di.ProcessorImplB" /> 通过使用下面的代码则可以两个jar包中的文仉加蝲q来 ApplicationContext ctx = new ClassPathXmlApplicationContext( 而如果写成下面的代码,只能找到其中的一个xml文g(序取决于jar包的加蝲序) ApplicationContext ctx = new ClassPathXmlApplicationContext( classpath*:的用是Z(jin)多个component(最l发布成不同的jar?q行开?各自的bean定义文g按照一定的规则:package+filename,而用这些component的调用者可以把q些文g都加载进? classpath*:的加载用了(jin)classloader? 来自Q?a target="_blank">http://blog.csdn.net/kkdelta/article/details/5507799 Spring框架则简化了(jin)使用JEElg(包括JMS)的Q务。它提供的模板机刉藏了(jin)典型的JMS实现的细节,q样开发h员可以集中精力放在处理消息的实际工作中,而不用担?j)如何去创徏Q访问或清除JMS资源?/p>
本文对Spring JMS API作一个概qͼq过一个运行在JBoss MQ服务器上的web例程来介l如何用Spring JMS API来异步处理(发送和接收Q消息。我通过传统JMS实现和Spring JMS实现两者间的比较,来展CZ用Spring JMS处理消息是如何的单和灉|?/p>
在现实中Q大多数webh都是同步处理的。例如,当用戯d一个网站,首先输入用户名和密码Q然后服务器验证d合法性。如果验证成功,E序允许该用户q入|站。这里,dh在从客户端接收以后被x(chng)处理?jin)。信用卡验证是另一个同步处理的例子Q只有服务器证实输入的信用卡h有效的,同时客户在帐户上有够的存款Q客h被允许l操作。但是让我们思考一下在序处理pȝ上的支付l算步骤。一旦系l证实该用户信用卡的信息是准的Qƈ且在帐户上有_的资金,׃必等到所有的支付l节落实、{账完成。支付结可以异步方式进行,q样客户可以l箋(hu)q行核查操作?/p>
需要比典型同步h耗费更长旉的请求,可以使用异步处理。另一个异步处理的例子是,在本地贷Ƒ֤理程序中Q提交至自动扉KpȝQAUSQ的信用h处理q程。当借方提交h甌后,抉|公司?x)向AUS发送请求,以获取信用历史记录。由于这个请求要求得到全面而又详细的信用报告,包括借方C和过ȝ帐户Q最q的付款和其他胦(ch)务资料,服务器需要耗费较长的时_(d)几小时或着有时甚至是几天)(j)来对q些h作出响应。客L(fng)E序Q应用)(j)要与服务器连接ƈ耗费如此长的旉来等待结果,q是毫无意义的。因此通信应该是异步发生的Q也是Q一旦请求被提交Q它?yu)p攄在队列中Q同时客L(fng)与服务器断开q接。然后AUS服务从指定的队列中选出hq行处理Qƈ处理得到的消息攄在另一个消息队列里。最后,客户端程序从q个队列中选出处理l果Q紧接着处理q个信用历史数据?/p>
如果(zhn)用过JMS代码Q?zhn)会(x)发现它与JDBC或JCA很像。它所包含的样本代码创建或JMS资源对象回溯Q得每一ơ?zhn)需要写一个新cL发送和接收消息Ӟ都具有更好的代码密集性和重复性。以下序列显CZ(jin)传统JMS实现所包括的步骤:(x) (zhn)可以看刎ͼ步骤6是处理消息的唯一地方。其他步骤都只是理与实际业务要求无关的JMS资源Q但是开发h员必ȝ写ƈl护q些额外步骤的代码?/p>
Spring框架提供?jin)一个模板机制来隐藏Java APIs的细节。JEE开发h员可以用JDBCTemplate和JNDITemplatecL分别讉K后台数据库和JEE资源Q数据源Q连接池Q。JMS也不例外。Spring提供JMSTemplatec,因此开发h员(sh)用ؓ(f)一个JMS实现ȝ写样本代码。接下来是在开发JMS应用E序时Spring所h一些的优势?/p>
说明Q因为只是ؓ(f)?jin)演C如何用spring~写jms的应用,所以本例没有什么实际用途?/p>
E序功能QMessageProducer.javaҎ(gu)一用户信息产生一个消息发送到 JMS ProviderQ由MessageConsumer.java接收?/p>
1.在Jboss里配|XML文g创徏一个新的JMS provider?br />
打开位于%JBOSS_HOME%server\default\deploy\jms文g夹下的jbossmq-destinations-service.xml文gQ加入以下代码片断:(x) (4).试用例Q?br />
//======== 生者测试用?=============== //============ 消费者测试用?=============== Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1418938 我们的Bean配置如下Q?/p>
如上所qͼ我们定义?jin)一个PropertyPlaceholderConfigurercȝ实例Qƈ其位置属性设|ؓ(f)我们的属性文件。该c被实现为Bean工厂的后处理器,q将使用定义在文件中的属性来代替所有的占位W(${...}valueQ?/p>
利用q种技术,我们可以从applicationContext.xml中移除所有特定于L的配|属性。通过q种方式Q我们可以自由地文gd新的BeanQ而不必担?j)特定于L属性的同步性。这样可以简化生产部|和l护?/p>
PropertyPlaceholderConfigurer作ؓ(f)一个bean factory post-processor实现Q可以用来将BeanFactory定义中的属性值放|到另一个单独的Java Properties格式的文件中。这使得用户不用对BeanFactory的主XML定义文gq行复杂和危险的修改Q就可以定制一些基本的属性(比如说数据库的urls,用户名和密码Q? 考虑一个BeanFactory定义的片断,里面用占位符定义?jin)DataSourceQ? 在下面这个例子中Q定义了(jin)一个datasourceQƈ且我们会(x)在一个外部Porperties文g中配|一些相兛_性?在运行时Q我们ؓ(f)BeanFactory提供一?tt class="literal">PropertyPlaceholderConfigurerQ它?yu)用Properties文g中的值替换掉q个datasource的属性|(x) 真正的值来自于另一个Properties格式的文? 如果要在BeanFactory中用,bean factory post-processor必须手动q行: 注意QApplicationContext能够自动辨认和应用在其上部v的实C(jin)BeanFactoryPostProcessor的bean。这意味着Q当使用ApplicationContext的时候应用PropertyPlaceholderConfigurer?x)非常的方便。由于这个原因,惌使用q个或者其他bean factory postprocessor的用户用ApplicationContext代替BeanFactroy? PropertyPlaceHolderConfigurer不仅仅在你指定的Porperties文g中查扑ֱ性, 如果它在其中没有扑ֈ你想使用的属性,它还?sh)(x)在Java的系lproperties中查找?q个行ؓ(f)能够通过讄配置中的systemPropertiesMode 属性来定制。这个属性有三个| 一个让配置L覆盖Q一个让?span class="emphasis">怸覆盖Q一个让它仅在properties文g中找不到的时候覆盖?请参?PropertiesPlaceholderConfigurer的JavaDoc获得更多信息?
"classpath*:com/test/rs/jarAppcontext.xml");
"classpath:com/test/rs/jarAppcontext.xml");getResources()
Ҏ(gu),如果是在不同的J2EE服务器上q行,׃应用服务器提供自qclassloader实现Q它们在处理jar文g时的行ؓ(f)也许?x)有所不同? 要测?classpath*:
是否有效Q可以用classloader从classpath中的jar文g里加载文件来q行试Q? getClass().getClassLoader().getResources("<someFileInsideTheJar>")
?上面的例子是在sun的jre中运行的状?
]]>
Scope 'session' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.
解決Ҏ(gu):
1. 在web.xml文g中添加listener
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<aop:scoped-proxy/>
</bean>
]]>轉自Qhttp://blog.csdn.net/huxin1/archive/2008/12/31/3669583.aspx
document.body.oncopy = function() {
if (window.clipboardData) {
setTimeout(function() {
var text = clipboardData.getData("text");
if (text && text.length>300) {
text = text + "\r\n\n本文来自CSDN博客Q{载请标明出处Q? + location.href;
clipboardData.setData("text", text);
}
}, 100);
}
}
1. 使用Spring注解来注入属?
1.1. 使用注解以前我们是怎样注入属性的
cȝ实现Q?
配置文gQ?
1.2. 引入@Autowired注解Q不推荐使用Q徏议用@ResourceQ?
cȝ实现Q对成员变量q行标注Q?
或者(Ҏ(gu)法进行标注)(j)
配置文g
@Autowired可以Ҏ(gu)员变量、方法和构造函数进行标注,来完成自动装配的工作。以上两U不同实现方?
中,@Autowired的标注位|不同,它们都会(x)在Spring在初始化userManagerImplq个beanӞ自动装配userDaoq个?
性,区别是:(x)W一U实CQSpring?x)直接将UserDaocd的唯一一个bean赋值给userDaoq个成员变量Q第二种实现中,Spring?
调用setUserDaoҎ(gu)来将UserDaocd的唯一一个bean装配到userDaoq个属性?
1.3. 让@Autowired工作h
要@Autowired能够工作Q还需要在配置文g中加入以下代?
1.4. @Qualifier
@Autowired是根据类型进行自动装配的。在上面的例子中Q如果当
Spring上下文中存在不止一个UserDaocd的beanӞ׃(x)抛出BeanCreationException异常Q如果Spring上下文中
不存在UserDaocd的beanQ也?x)抛出BeanCreationException异常。我们可以用@Qualifier配合
@Autowired来解册些问题?
1. 可能存在多个UserDao实例
q样QSpring?x)找到id为userDao的beanq行装配?
2. 可能不存在UserDao实例
1.5. @ResourceQJSR-250标准注解Q推荐用它来代替Spring专有的@Autowired注解Q?
Spring 不但支持自己定义的@Autowired注解Q还支持几个由JSR-250规范定义的注解,它们分别是@Resource、@PostConstruct以及(qing)@PreDestroy?
@Resource
的作用相当于@AutowiredQ只不过@Autowired按byType自动注入Q而@Resource默认按byName自动注入|了(jin)?
@Resource有两个属性是比较重要的,分别是name和typeQSpring@Resource注解的name属性解析ؓ(f)bean的名字,?
type属性则解析为bean的类型。所以如果用name属性,则用byName的自动注入策略,而用type属性时则用byType自动注入{?
略。如果既不指定name也不指定type属性,q时通过反射机制使用byName自动注入{略?
@Resource装配序
1.6. @PostConstructQJSR-250Q?
在方法上加上注解@PostConstructQ这个方法就?x)在Bean初始化之后被Spring容器执行Q注QBean初始化包括,实例化BeanQƈ装配Bean的属性(依赖注入Q)(j)?
它的一个典型的应用场景是,当你需要往Bean里注入一个其父类中定义的属性,而你又无法复写父cȝ属性或属性的setterҎ(gu)Ӟ如:(x)
q里通过@PostConstructQؓ(f)UserDaoImpl的父c里定义的一个sessionFactoryU有属性,注入?
我们自己定义的sessionFactoryQ父cȝsetSessionFactoryҎ(gu)为finalQ不可复写)(j)Q之后我们就可以通过调用
super.getSessionFactory()来访问该属性了(jin)?
1.7. @PreDestroyQJSR-250Q?
在方法上加上注解@PreDestroyQ这个方法就?x)在Bean初始化之后被Spring容器执行。由于我们当前还没有需要用到它的场景,q里不不LC。其用法同@PostConstruct?
1.8. 使用<context:annotation-config />化配|?
Spring2.1
d?jin)一个新的context的Schema命名I间Q该命名I间Ҏ(gu)释驱动、属性文件引入、加载期l入{功能提供了(jin)便捷的配|。我们知道注释本w是不会(x)
做Q何事情的Q它仅提供元数据信息。要使元数据信息真正起作用,必须让负责处理这些元数据的处理器工作h?
AutowiredAnnotationBeanPostProcessor
和CommonAnnotationBeanPostProcessor是处理q些注释元数据的处理器。但是直接在Spring配置文g中定义这?
Bean昑־比较W拙。Spring为我们提供了(jin)一U方便的注册q些BeanPostProcessor的方式,q就
?lt;context:annotation-config />Q?
<context:annotationconfig
/>隐式地向Spring容器注册AutowiredAnnotationBeanPostProcessor?
CommonAnnotationBeanPostProcessor?
PersistenceAnnotationBeanPostProcessor以及(qing)
RequiredAnnotationBeanPostProcessorq?个BeanPostProcessor?
2. 使用Spring注解完成Bean的定?
以上我们介绍?jin)通过@Autowired或@Resource来实现在Bean中自动注入的功能Q下面我们将介绍如何注解BeanQ从而从XML配置文g中完全移除Bean定义的配|?
2.1. @ComponentQ不推荐使用Q、@Repository、@Service、@Controller
只需要在对应的类上加上一个@Component注解Q就该cd义ؓ(f)一个Bean?jin)?x)
使用@Component注解定义的BeanQ默认的名称QidQ是写开头的非限定类名。如q里定义的Bean名称是userDaoImpl。你也可以指定Bean的名Uͼ(x)
@Component("userDao")
@Component
是所有受Spring理lg的通用形式QSpringq提供了(jin)更加l化的注解Ş式:(x)@Repository、@Service?
@ControllerQ它们分别对应存储层BeanQ业务层BeanQ和展示层Bean。目前版本(2.5Q中Q这些注解与@Component的语?
是一L(fng)Q完全通用Q在Spring以后的版本中可能?x)给它们q加更多的语义。所以,我们推荐使用@Repository、@Service?
@Controller来替代@Component?
2.2. 使用<context:component-scan />让Bean定义注解工作h
q里Q所有通过<bean>元素定义Bean的配|内容已l被U除Q仅需要添加一
?lt;context:component-scan />配置px(chng)有问题(sh)(jin)——Spring
XML配置文g得到?jin)极致的化(当然配置元数据还是需要的Q只不过以注释Ş式存在Ş?jin)?j)?lt;context:component-scan
/>的base-package属性指定了(jin)需要扫描的cdQ类包及(qing)光归子包中所有的c都?x)被处理?
<context:component-scan />q允许定义过滤器基包下的某些类U_或排除。Spring支持以下4U类型的qo(h)方式Q?
以正则表辑ּZQ我列D一个应用实例:(x)
值得注意的是<context:component-scan
/>配置不但启用了(jin)对类包进行扫描以实施注释驱动Bean定义的功能,同时q启用了(jin)注释驱动自动注入的功能(卌隐式地在内部注册?
AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessorQ,
因此当?lt;context:component-scan
/>后,可以将<context:annotation-config />U除?jin)?
2.3. 使用@Scope来定义Bean的作用范?
在用XML定义BeanӞ我们可能q需要通过bean的scope属性来定义一个Bean的作用范_(d)我们同样可以通过@Scope注解来完成这工作:(x)
3. 参?
http://kingtai168.javaeye.com/blog/244002
http://www.javaeye.com/topic/244153
http://static.springframework.org/spring/docs/2.5.x/reference/beans.html#beans-annotation-config
http://static.springframework.org/spring/docs/2.5.x/reference/beans.html#beans-classpath-scanning
]]>
package com.deity.ranking.util;
import java.util.List;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
/** * 分页函数 *
* @author allenpan */
public class Pagination extends JdbcDaoSupport{
public static final int NUMBERS_PER_PAGE = 10;
//一|C的记录?br />
private int numPerPage;
//记录L
private int totalRows;
//总页?br />
private int totalPages;
//当前늠
private int currentPage;
//起始行数
private int startIndex;
//l束行数
private int lastIndex;
//l果集存放List
private List resultList;
//JdbcTemplate jTemplate
private JdbcTemplate jTemplate;
/**
* 每页昄10条记录的构造函?使用该函数必dlPagination讄currentPageQjTemplate初?br />
* @param sql oracle语句
*/
public Pagination(String sql){
if(jTemplate == null){
throw new IllegalArgumentException("com.deity.ranking.util.Pagination.jTemplate is null,please initial it first. ");
}else if(sql.equals("")){
throw new IllegalArgumentException("com.deity.ranking.util.Pagination.sql is empty,please initial it first. ");
}
new Pagination(sql,currentPage,NUMBERS_PER_PAGE,jTemplate);
}
/**分页构造函?br />
* @param sql Ҏ(gu)传入的sql语句得到一些基本分信?br />
* @param currentPage 当前?br />
* @param numPerPage 每页记录?br />
* @param jTemplate JdbcTemplate实例
*/
public Pagination(String sql,int currentPage,int numPerPage,JdbcTemplate jTemplate){
if(jTemplate == null){
throw new IllegalArgumentException("com.deity.ranking.util.Pagination.jTemplate is null,please initial it first. ");
}else if(sql == null || sql.equals("")){
throw new IllegalArgumentException("com.deity.ranking.util.Pagination.sql is empty,please initial it first. ");
}
//讄每页昄记录?br />
setNumPerPage(numPerPage);
//讄要显C的|
setCurrentPage(currentPage);
//计算总记录数
StringBuffer totalSQL = new StringBuffer(" SELECT count(*) FROM ( ");
totalSQL.append(sql);
totalSQL.append(" ) totalTable ");
//lJdbcTemplate赋?br />
setJdbcTemplate(jTemplate);
//总记录数
setTotalRows(getJdbcTemplate().queryForInt(totalSQL.toString()));
//计算总页?br />
setTotalPages();
//计算起始行数
setStartIndex();
//计算l束行数
setLastIndex();
System.out.println("lastIndex="+lastIndex);//////////////////
//构造oracle数据库的分页语句
StringBuffer paginationSQL = new StringBuffer(" SELECT * FROM ( ");
paginationSQL.append(" SELECT temp.* ,ROWNUM num FROM ( ");
paginationSQL.append(sql);
paginationSQL.append(" ) temp where ROWNUM <= " + lastIndex);
paginationSQL.append(" ) WHERE num > " + startIndex);
//装入l果?br />
setResultList(getJdbcTemplate().queryForList(paginationSQL.toString()));
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub }
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getNumPerPage() {
return numPerPage;
}
public void setNumPerPage(int numPerPage) {
this.numPerPage = numPerPage;
}
public List getResultList() {
return resultList; }
public void setResultList(List resultList) {
this.resultList = resultList;
}
public int getTotalPages() {
return totalPages;
}
//计算总页?br />
public void setTotalPages() {
if(totalRows % numPerPage == 0){
this.totalPages = totalRows / numPerPage;
}else{
this.totalPages = (totalRows / numPerPage) + 1;
}
}
public int getTotalRows() {
return totalRows;
}
public void setTotalRows(int totalRows) {
this.totalRows = totalRows;
}
public int getStartIndex() {
return startIndex;
}
public void setStartIndex() {
this.startIndex = (currentPage - 1) * numPerPage;
}
public int getLastIndex() {
return lastIndex;
}
public JdbcTemplate getJTemplate() {
return jTemplate;
}
public void setJTemplate(JdbcTemplate template) {
jTemplate = template;
}
//计算l束时候的索引
public void setLastIndex() {
System.out.println("totalRows="+totalRows);///////////
System.out.println("numPerPage="+numPerPage);///////////
if( totalRows < numPerPage){
this.lastIndex = totalRows;
}else if((totalRows % numPerPage == 0) || (totalRows % numPerPage != 0 && currentPage < totalPages)){
this.lastIndex = currentPage * numPerPage;
}else if(totalRows % numPerPage != 0 && currentPage == totalPages){//最后一?br />
this.lastIndex = totalRows ;
}
}}在我的业务逻辑代码中:(x)
/**
* find season ranking list from DC
* @param areaId 选手区域id
* @param rankDate 赛季
* @param category cd
* @param characterName 角色?br />
* @return List
*/
public List findSeasonRankingList(Long areaId, int rankYear,int rankMonth,
Long categoryId,String characterName) {
//SQL语句
StringBuffer sql = new StringBuffer(" SELECT C.USERID userid,D.POSNAME posname,C.GAMEID gameid,C.AMOUNT amount,C.RANK rank FROM ");
//表 sql.append(" (SELECT B.USERID USERID,");
sql.append(" B.POSID POSID,");
sql.append(" A.DISTRICT_CODE DISTRICTCODE,");
sql.append(" A.GAMEID GAMEID,");
sql.append(" AMOUNT AMOUNT,");
sql.append(" RANK RANK ");
sql.append(" FROM TB_FS_RANK A ");
sql.append(" LEFT JOIN TB_CHARACTER_INFO B ");
sql.append(" ON A.DISTRICT_CODE = B.DISTRICT_CODE ");
sql.append(" AND A.GAMEID = B.GAMEID ");
//附加条g
if(areaId != null && areaId.intValue() != 0){
sql.append(" and A.DISTRICT_CODE = " + areaId.intValue());
}
if( rankYear > 1970 && rankMonth > 0){
//hql.append(" and sas.id.dt >= to_date('" + rankYear + "-" + rankMonth + "-01 00:00:00'," + "YYYY-MM-DD HH24:MI:SS");
//hql.append(" and sas.id.dt <= to_date('" + rankYear + "-" + rankMonth + "-" + TimeTool.findMaxDateInMonth(rankYear,rankMonth) + " 23:59:59'," + "YYYY-MM-DD HH24:MI:SS");
sql.append(" and A.DT = fn_time_convert(to_date('" + rankYear + "-" + rankMonth + "'," + "'YYYY-MM')) ");
}
if(categoryId != null && categoryId.intValue() != 0){
sql.append(" and A.CID = " + categoryId.intValue());
}
if(characterName != null && !characterName.trim().equals("")){
sql.append(" and A.GAMEID = '" + characterName.trim()+"' ");
}
sql.append(" ORDER BY RANK ASC) C ");
sql.append(" LEFT JOIN TB_FS_POSITION D ");
sql.append(" ON C.POSID = D.POSID ");
sql.append(" ORDER BY C.RANK ");
System.out.println("hql="+sql.toString());////////////////
//使用自己的分늨序控制结果集
Pagination pageInfo = new Pagination(sql.toString(),1,10,getJdbcTemplate());
return pageInfo.getResultList();
//return getJdbcTemplate().queryForList(sql.toString());
}
文章來源Qhttp://java.chinaitlab.com/Spring/38091.html
]]>
]]>异步消息传递和面向服务架构
JMS
Spring JMS
CZE序
<!-- Register User Send/Receive Queue -->
<mbean code="org.jboss.mq.server.jmx.Queue"
name="jboss.mq.destination:service=Queue,name=registerUserQueue">
<depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
</mbean>
<!-- Register User Send/Receive Topic -->
<mbean code="org.jboss.mq.server.jmx.Topic"
name="jboss.mq.destination:service=Topic,name=registerUserTopic">
<depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
</mbean>
2.在spring的配|文件中配置JMSlg的具体细节?br />
Q?QJNDI上下文是取得JMS资源的v始位|,因此首先我们要配|JNDI模板Q?br />
<!-- JNDI上下?它是取得JMS资源的v始位|? -->
<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.factory.initial">
org.jnp.interfaces.NamingContextFactory
</prop>
<prop key="java.naming.provider.url">localhost</prop>
<prop key="java.naming.factory.url.pkgs">
org.jnp.interfaces:org.jboss.naming
</prop>
</props>
</property>
</bean>
注意Q此JNDI模板用到?jin)org.jnp.interfaces.NamingContextFactory所以要?JBOSS_HOME%\client下的jbossall-client.jar加到你的目的classpath中?br />
Q?Q配|连接工厂:(x)
<!-- JMSq接工厂 -->
<bean id="jmsConnectionFactory"class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiTemplate">
<ref bean="jndiTemplate" />
</property>
<property name="jndiName">
<value>XAConnectionFactory</value>
</property>
</bean>
注意QXAConnectionFactoryq个JNDI名字是在%JBOSS_HOME%server\default\deploy\jms文g夹下的jms-ds.xml中定义的(它是由JBoss指定??br />
Q?Q配|JmsTemplatelg。在例程中我们用JmsTemplate102。同时用defaultDestination属性来指定JMS目标?br />
<!-- JMS模板配置 -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate102">
<property name="connectionFactory" ref="jmsConnectionFactory" />
<property name="defaultDestination" ref="destination" />
<property name="pubSubDomain">
<value>true</value>
</property>
<!-- {待消息的时?ms) -->
<property name="receiveTimeout">
<value>30000</value>
</property>
</bean>
注意Q如果用topic-subscribe(主题订阅)模式Q该模板的pubSubDomain属性gؓ(f)true;若用PToP(点对?模式QpubSubDomain属性gؓ(f)false或不配置该属性?br />
(4)定义一个JMS目标来发送和接收消息:
<bean id="destination" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiTemplate">
<ref bean="jndiTemplate" />
</property>
<property name="jndiName">
<value>topic/registerUserTopic</value>
</property>
</bean>
(5)配置发送者和接收者组?
<!-- 消息发布?-->
<bean id="msgProducer" class="com.boco.jms.MessageProducer">
<property name="jmsTemplate" ref="jmsTemplate" />
</bean>
<!-- 消息接收?-->
<bean id="msgConsumer" class="com.boco.jms.MessageConsumer">
<property name="jmsTemplate" ref="jmsTemplate" />
</bean>
3.相应的类:
(1). User对象?br />
/**
* User.java
* created on Jul 2, 2006
* Copyrights 2006 BOCO,Inc. All rights reserved.
*/
package com.boco.dto;
import java.io.Serializable;
/**
* desc: 用户信息 Bean
* @author qiujy
*/
public class User {
private int id;
private String username;
private String password;
private String email;
public User(){}
//以下为Getter,setterҎ(gu)?br />
......
}
(2).消息生者:(x)
/**
* MessageProducer.java
* created on Jul 22, 2006
* Copyrights 2006 BOCO,Inc. All rights reserved.
*/
package com.boco.jms;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.Session;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import com.boco.dto.User;
/**
* desc:消息生?br />
* @author qiujy
*
*/
public class MessageProducer {
/** JMS模板 */
private JmsTemplate jmsTemplate;
public void setJmsTemplate(JmsTemplate jmsTemplate){
this.jmsTemplate = jmsTemplate;
}
public void sendMessage(final User user){
//调用模板的send来发送消?br />
jmsTemplate.send(new MessageCreator(){
public Message createMessage(Session session) throws JMSException {
//构造一个要发送的消息
MapMessage message = session.createMapMessage();
message.setInt("id", user.getId());
message.setString("username", user.getUsername());
message.setString("password", user.getPassword());
message.setString("email", user.getEmail());
System.out.println("send success!!");
return message;
}
});
}
}
(3).消息消费者:(x)
/**
* MessageConsumer.java
* created on Jul 22, 2006
* Copyrights 2006 BOCO,Inc. All rights reserved.
*/
package com.boco.jms;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import org.springframework.jms.core.JmsTemplate;
import com.boco.dto.User;
/**
* desc:消息消费?br />
* @author qiujy
*
*/
public class MessageConsumer {
/** JMS模板 */
private JmsTemplate jmsTemplate;
public void setJmsTemplate(JmsTemplate jmsTemplate){
this.jmsTemplate = jmsTemplate;
}
public User receiveMessage(){
//参数为Destination的JNDI名字L前面的模式类型标?br />
//MapMessage msg = (MapMessage)jmsTemplate.receive("registerUserQueue");
MapMessage msg = (MapMessage)jmsTemplate.receive("registerUserTopic");
User user = new User();
try {
user.setId(msg.getInt("id"));
user.setUsername(msg.getString("username"));
user.setPassword(msg.getString("password"));
user.setEmail(msg.getString("email"));
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return user;
}
}
/**
* TestMsgProducer.java
* created on Jul 22, 2006
* Copyrights 2006 BOCO,Inc. All rights reserved.
*/
package com.boco.jms;
import junit.framework.TestCase;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.boco.dto.User;
/**
* desc:
* @author qiujy
*
*/
public class TestMsgProducer extends TestCase {
private ApplicationContext context;
/**
* @param arg0
*/
public TestMsgProducer(String arg0) {
super(arg0);
context = new ClassPathXmlApplicationContext("applicationContext_jms.xml");
}
/* (non-Javadoc)
* @see junit.framework.TestCase#setUp()
*/
protected void setUp() throws Exception {
super.setUp();
}
/* (non-Javadoc)
* @see junit.framework.TestCase#tearDown()
*/
protected void tearDown() throws Exception {
super.tearDown();
}
/**
* Test method for {@link com.boco.jms.MessageProducer#sendMessage(com.boco.dto.User)}.
*/
public void testSendMessage() {
User user = new User();
user.setId(132);
user.setUsername("JMSTest");
user.setPassword("password");
user.setEmail("support@boco.com.cn");
MessageProducer producer = (MessageProducer)context.getBean("msgProducer");
producer.sendMessage(user);
}
}
/**
* TestMsgConsumer.java
* created on Jul 22, 2006
* Copyrights 2006 BOCO,Inc. All rights reserved.
*/
package com.boco.jms;
import junit.framework.TestCase;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.boco.dto.User;
/**
* desc:
* @author qiujy
*
*/
public class TestMsgConsumer extends TestCase {
private ApplicationContext context;
/**
* @param arg0
*/
public TestMsgConsumer(String arg0) {
super(arg0);
context = new ClassPathXmlApplicationContext("applicationContext_jms.xml");
}
/* (non-Javadoc)
* @see junit.framework.TestCase#setUp()
*/
protected void setUp() throws Exception {
super.setUp();
}
/* (non-Javadoc)
* @see junit.framework.TestCase#tearDown()
*/
protected void tearDown() throws Exception {
super.tearDown();
}
/**
* Test method for {@link com.boco.jms.MessageConsumer#receiveMessage()}.
*/
public void testReceiveMessage() {
MessageConsumer consumer = (MessageConsumer)context.getBean("msgConsumer");
User user = consumer.receiveMessage();
assertNotNull(user);
System.out.println( "id========" + user.getId()
+ "\nname======" + user.getUsername()
+ "\npassword==" + user.getPassword()
+ "\nemail=====" + user.getEmail());
}
}
启动JBOSS服务?先运行TestMsgConsumer.java;再运行TestMsgProducer.java,卛_看到控制台的输出?d~~~~~
]]>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>classpath:com/starxing/test/jdbc.properties</value>
</property>
<!--
使用locations属性定义多个配|文?br />
<property name="locations">
<list>
<value>classpath:config/maxid.properties</value>
<value>classpath:config/jdoserver.properties</value>
</list>
</property>
-->
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="url">
<value>${database.url}</value>
</property>
<property name="driverClassName">
<value>${database.driver}</value>
</property>
<property name="username">
<value>${database.user}</value>
</property>
<property name="password">
<value>${database.password}</value>
</property>
</bean>
</beans>
3.Config.java
package com.starxing.test;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.FileSystemResource;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
public class Config {
public static void main(String[] args) {
XmlBeanFactory factory = new XmlBeanFactory(new FileSystemResource(
"com/starxing/test/conf.xml"));
// 如果要在BeanFactory中用,bean factory post-processor必须手动q行:
PropertyPlaceholderConfigurer cfg = new PropertyPlaceholderConfigurer();
cfg.setLocation(new FileSystemResource(
"com/starxing/test/jdbc.properties"));
cfg.postProcessBeanFactory(factory);
DriverManagerDataSource dataSource = (DriverManagerDataSource) factory
.getBean("dataSource");
System.out.println(dataSource.getDriverClassName());
// 注意QApplicationContext能够自动辨认和应用在其上部v的实C(jin)BeanFactoryPostProcessor的bean。这意味着Q当使用ApplicationContext的时候应用PropertyPlaceholderConfigurer?x)非常的方便。由于这个原因,惌使用q个或者其他bean
// factory postprocessor的用户用ApplicationContext代替BeanFactroy?br />
ApplicationContext context = new ClassPathXmlApplicationContext(
"com/starxing/test/conf.xml");
DriverManagerDataSource dataSource2 = (DriverManagerDataSource) context
.getBean("dataSource");
System.out.println(dataSource2.getDriverClassName());
}
}
相关文:
使用q一解决Ҏ(gu)Q我们可以生成如下的属性文Ӟ/WEB-INF/jdbc.propertiesQ:(x)
jdbc.driver=org.postgresql.Driver
jdbc.url=jdbc:postgresql://localhost/test
jdbc.user=postgres
jdbc.password=
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>/WEB-INF/jdbc.properties</value>
</property>
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>${jdbc.driver}</value>
</property>
<property name="url">
<value>${jdbc.url}</value>
</property>
<property name="username">
<value>${jdbc.user}</value>
</property>
<property name="password">
<value>${jdbc.password}</value>
</property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName"><value>${jdbc.driverClassName}</value></property>
<property name="url"><value>${jdbc.url}</value></property>
<property name="username"><value>${jdbc.username}</value></property>
<property name="password"><value>${jdbc.password}</value></property>
</bean>jdbc.driverClassName=org.hsqldb.jdbcDriver
jdbc.url=jdbc:hsqldb:hsql://production:9002
jdbc.username=sa
jdbc.password=rootXmlBeanFactory factory = new XmlBeanFactory(new FileSystemResource("beans.xml"));
PropertyPlaceholderConfigurer cfg = new PropertyPlaceholderConfigurer();
cfg.setLocation(new FileSystemResource("jdbc.properties"));
cfg.postProcessBeanFactory(factory);
文章来源:http://www.cublog.cn/u/9295/showart.php?id=261437
]]>
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.ajaxtags.helpers.AjaxXmlBuilder;
import org.ajaxtags.servlets.BaseAjaxServlet;
import org.springframework.web.context.support.WebApplicationContextUtils;
import dgut.ke.model.Book;
import dgut.ke.service.IBookService;
@SuppressWarnings("serial")
public class BookCallOut extends BaseAjaxServlet {
private IBookService bookService;
@Override
public String getXmlContent(HttpServletRequest request,
HttpServletResponse response) throws Exception {
request.setCharacterEncoding("UTF-8");
String bookName = request.getParameter("bookName");
System.out.println("---- " + bookName);
Book book = (Book) bookService.findForObject(
"from Book as b where b.bookName=?",new Object[]{bookName});
AjaxXmlBuilder builder = new AjaxXmlBuilder()
.addItemAsCData("提示标题", "<P>关于书籍:<b>" + book.getBookNo() +"</b>的信息如?<br/></p>");
return builder.toString();
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
// 必须在重写方法的W一行调用以下语?br />
super.init(servletConfig);
bookService = (IBookService) WebApplicationContextUtils
.getRequiredWebApplicationContext(getServletContext())
.getBean("bookService");
}
}
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
public class MailTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
JavaMailSender mailSender = (JavaMailSender) context.getBean("mailSender");
SimpleMailMessage mail = new SimpleMailMessage();
mail.setFrom("sskwfnihc@gmail.com");
mail.setTo("sskwfnihc@163.com");
mail.setSubject("KEl你发了(jin)一邮?);
mail.setText("This is a mailTest example");
mailSender.send(mail);
System.out.println("成功发送文本文Ӟ");
}
}
spring配置文g:
... ...
<!-- 发送电(sh)子邮?-->
<bean id="mailSender"
class="org.springframework.mail.javamail.JavaMailSenderImpl"
abstract="false" lazy-init="default" autowire="default"
dependency-check="default">
<property name="host" value="smtp.gmail.com"></property>
<property name="port" value="465"></property>
<property name="username">
<value>sskwfnihc</value>
</property>
<property name="password">
<value>write your password here</value>
</property>
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.starttls.enable">true</prop>
<prop key="mail.smtp.socketFactory.class">javax.net.ssl.SSLSocketFactory</prop>
</props>
</property>
</bean>
... ...
在spring2.0中,一共定义了(jin)5U作用域Q分别是singleton、prototype、request、session?br /> globalSession。其中后面三U仅对WEB应用E序有效?br /> spring2.0通过scope=""属性来定义Bean有作用域Q而在spring1.x中,׃只有singleton ?br /> prototypeq两U作用域Q因此,spring1.x中定义Bean的作用域是通过singleton=“true|false" ?br /> 定义的。在spring2.0中首先应该考虑用scope属性来定义Bean 的作用域?/p>
Singleton作用?br />
spring2.0是默认Bean的作用域是scope="singleton"。即spring的IoC容器仅ؓ(f)每个Bean创徏一?br />
实例q且保持Bean的引用,换言之,每次调用getBean()Ҏ(gu)hq回的BeanL同一个实例。这cM
于《设计模式》一书中的SingletonQ单例)(j)模式?/p>
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {};
pubilc static Singleton getInstance() {
return instance;
}
}
׃构造方法被x(chng)为privateQ因此,在类的外部不可实例化该类Q唯一的实例持有在?rn)态引用中
从外部获取该实例的唯一入口是调用Singleton的静(rn)态方法Singleton.getInstance().
Prototype作用?/p>
如果需要每ơ返回Bean的新实例Q即每次都新Z个实例,则可以通过讄scope="prototype"?br />
实现。这h们就告诉?jin)spring容器采用Prototype作用域。采用prototype作用域时Qspring容器M(x)
q回一个创建的新实例,因此spring容器一旦将实例交给客户端,׃再对其进行跟t引用了(jin)Q所?br />
无法对prototype作用域的Bean定义destory-method,不过仍可以用init-method?br />
其它三个属性g对WEBE序有效Q这里不作讨论?/p>
IoC全称Inversion of Control,直译为控制反?何谓IoC?在解释此概念之前,我们来看看下面的例子
import ...
public class BookService {
private BookDAO bookDAO = new DbBookDAO();
public List<Book> listBooks(String author) {
List<Book> books = bookDAO.listAll();
return books ;
}
}
可以看到,listBooksҎ(gu)的功能非常简?卛_出所有书c?而列出所有书c的功能被委托给bookDAO对象.
考虑Cc可能存在多UŞ?如数据库,XML文g{?BookDAOx(chng)为接?因此我们实现?jin)一个具?br />
子类DbBookDAO.
现在需要考虑的是,BookService如何持有bookDAO对象.最单的办法?在BookService的内部持?br />
一个DbBookDAO的实?上面的例子确实是q么做的.考虑一下会(x)发现以下的问?
(1)在BookService中硬~码创徏?jin)BookDAO,如果需要另一UBookDAO的实?则需要修改BookService?br />
代码,换句话就是BookServicelg不能qBookDAO的具体实?
(2)BookDAO的实例无法被其它lg׃n.假设其它的组件也需要引用BookDAO,则多个组件很隑օ享一?br />
BookDAO实例,因ؓ(f)该实例的生命周期定义在了(jin)BookServicelg中了(jin),从而难以共?
(3)如果BookDAO仍需要引用其它资?例如DataSource,则BookService可能q需要负责管理和l护一?br />
DataSource,而这实例不是作ؓ(f)上层lgBookService的职?
(4)试BookService是复杂的,因ؓ(f)首先~写DbBookDAO,倘若DbBookDAOq(sh)赖于DataSource,是相当复?
从以上几点可以看?如果pȝ中有大量的组?其它生命周期和相互之间的依赖关系,如果q?br />
自己l护,不但加大的系l的复杂?而且?x)导致组件之间的极?f)紧密的耦合,l而给试和维护带来了(jin)
极大的困?
在IoC模式?控制权发生了(jin)反{:从应用程序{Ud?jin)IoC容器.lg不再由应用程序负责创建和配置
而是由容器负?应用E序只需直接使用已经创徏q|好的组?
import ...
public class BookService {
private BookDAO bookDAO ;
public void setBookDAO(BookDAO bookDAO) {
this.bookDAO = bookDAO ;
}
public List<Book> listBooks(String author) {
List<Book> books = bookDAO.listAll();
return books ;
}
}
修改后的bookDAO实例不再由BookService创徏,而是由IoC容器负责某个BookDAO实例通过setBookDAO()
注入.q样做的好处:
(1)BookService不必兛_(j)如何创徏BookDAO的实?也不必关?j)BookDAO的具体实?只需要用它?yu)可以?jin)
因此化了(jin)BookService的编?
(2)BookDAO的实例由IoC容器理,因此,可以在多个组件之间共?只要它们也实C(jin)相应的setBookDAO()
Ҏ(gu)可以了(jin).
(3)试BookService也变成十分容易了(jin).
IoC容器负责实例化所有的lg,因此需要告诉容器如何创建组件和各组件之间的依赖关系.
spring的Ioc容器Ҏ(gu)XML配置文g来初始化Bean.需要注意的一Ҏ(gu),ApplicationContext初始化Bean和基
本的BeanFactory有所不同,基本的BeanFactoryL延迟加蝲Bean,直到W一ơ调用getBean("BeanId")Ҏ(gu)
hBean实例?BeanFactory才会(x)创徏q个Bean,而ApplicationContext在自w初始化时就一ơ性创Z(jin)
所有的Bean,?jin)解q一Ҏ(gu)非常重要?因ؓ(f)ApplicationContext在初始化时就能验证XML配置文g的正?
而用BeanFactory,直到调用getBean("BeanId")Ҏ(gu)获取Bean实例?才可能会(x)发现配置错误而导致抛?br />
异常.
只有在非常简单的情况?使用基本的BeanFactory才可能满x(chng)们的需?l大多时候我们?br />
ApplicationContext是最佳的选择.在启动的时候就能检配|文件的错误,q比使用基本的BeanFactory
在运行一D|间后调用getBean("BeanId")抛出异常要好得多.q且,延迟加蝲?x)带来性能上的损失.
ApplicationContext׃在启动时需要一ơ性别实例化所有的Bean,如果定义的Bean比较?则启动的旉
?x)比较?
<script type='text/javascript'>
function regUserChked(){public class CharacterEncodingFilter
Servlet 2.3/2.4 Filter that allows one to specify a character encoding for requests. This is useful because current browsers typically do not set a character encoding even if specified in the HTML page or form.
This filter can either apply its encoding if the request does not already specify an encoding, or enforce this filter's encoding in any case ("forceEncoding"="true"). In the latter case, the encoding will also be applied as default response encoding on Servlet 2.4+ containers (although this will usually be overridden by a full content type set in the view).
public interface TimeBookInterface{
public void doAuditing(String name);
}
(2)~写接口实现c?代码如下
/*******TimeBook.java********/
package com.gc.dao.impl;
public class TimeBook implements TimeBookInterface{
public void doAuditing(String name){
//审查数据的相关程?br> ......
}
}
(3)~写一个代理类,用来实现日志输出,其代码如?br>/*******TimeBookProxy.java********/
package com.gc.dao.impl;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
public class TimeBookProxy{
private Logger logger = Logger.getLogger(this.getClass().getName());
private TimeBookInterface timeBookInterface;
public TimeBookProxy(TimeBookInterface timeBookInterface){
this.timeBookInterface = timeBookInterface;
}
//实际业务处理
public void doAuditing(String name){
logger.log(Level.INFO,name+"开始审核数?);
timeBookInterface.doAuditing(name);
logger.log(Level.INFO,name+"审核数据l束");
}
}
(4)~写试代码c?br>......
public static void main(String[] args){
//针对接口q行~程
TimeBookProxy timeBookProxy = new TimeBookProxy(new TimeBook());
timeBookProxy.doAuditing("张三");
}
使用java的代理机制进行日志输?/em>
(1)~写一个日志信息的代理cLogProxy,q个代理cdC(jin)接口InvocationHandler,
可以对Q何接口实现日志信息的输出.其代理如?br>package com.gc.dao;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
//代理cdC(jin)接口InvocationHandler
public class LogProxy implements InvocationHandler{
private Logger logger = Logger.getLogger(this.getClass().getName());
private Object delegate;
//l定对象
public Object bing(Object delegate){
this.delegate = delegate;
return Proxy.new ProxyInstance(delegate.getClass().getClassLoader(),delegate.getClass().getInterfaces(),this);
}
//针对接口~程
public Object invoke(Object proxy,Mehtod method,Object[] args)throws Throwable{
Object result = null;
try{
//在方法调用前后进行日志输?br> logger.log(Level.INFO,args[0] + "开始审核数?);
result = method.invoke(delegate,args);
logger.log(Level.INFO,args[0] + "审核数据l束");
}
catch(Exception e){
logger.log(Level.INFO,e.toString());
}
return result;
}
}
(2)建立一个接口TimeBookInterface,代码如下
/*******TimeBookInterface.java********/
package com.gc.dao;
public interface TimeBookInterface{
public void doAuditing(String name);
}
(3)~写接口实现c?代码如下
/*******TimeBook.java********/
package com.gc.dao.impl;
public class TimeBook implements TimeBookInterface{
public void doAuditing(String name){
//审查数据的相关程?br> ......
}
}
(4)~写试代码c?br>......
public static void main(String[] args){
//实现?jin)对日志cȝ重用
LogProxy logProxy = new LogProxy();
TimeBookInterface timeBookInterface = (TimeBookInterface)logProxy.bind(new TimeBook());
timeBookProxy.doAuditing("张三");
}
代码来自spring从入门到_N一?/p>
List
<bean id="helloWorld" class="...">
<property name="message">
<list>
<value>one</value>
<value>two</value>
<value>three</value>
</list>
</property>
</bean>
Set
<bean id="helloWorld" class="...">
<property name="message">
<set>
<value>one</value>
<value>two</value>
<value>three</value>
</set>
</property>
</bean>
Map
<bean id="helloWorld" class="...">
<property name="message">
<map>
<entry key="keytwo">
<value>one</value>
</entry>
<entry key="keytwo">
<value>two</value>
</entry>
</map>
</property>
</bean>
Properties
<bean id="helloWorld" class="...">
<property name="message">
<props>
<prop key="keyone">one</prop>
<prop key="keytwo">two</prop>
</props>
</property>
</bean>
对应的javacMؓ(f):
import java.util.TimerTask;
public class MainTask extends TimerTask {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("--------------执行定时d---------------");
}
}
------------------------------------------------------------------------------------------------------------
文g/WEB-INF/TimerConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "<beans>
<!-- 注册定时执行实体 -->
<bean id="mainTask" class="dgut.ke.timer.MainTask"></bean>
<!-- 注册定时信息 -->
<bean id="stTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<!-- 首次执行d前需要等?U钟 -->
<property name="delay">
<value>2000</value>
</property>
<!-- d执行的周?-->
<property name="period">
<value>4000</value>
</property>
<!-- 具体的执行Q?-->
<property name="timerTask">
<ref local="mainTask"/>
</property>
</bean>
<!-- 配置d调度?-->
<bean id="timeFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">
<!-- 注入定时器列?-->
<property name="scheduledTimerTasks">
<list>
<ref local="stTask"/>
</list>
</property>
</bean>
</beans>
------------------------------------------------------------------------------------------------------------
import java.util.Calendar;
import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class NotLeaveWord extends HandlerInterceptorAdapter
{
private int startTime;
private int endTime;
private String interceptorPage;
/*通过依赖注入*/
public void setStartTime(int startTime) {
this.startTime = startTime;
}
public void setEndTime(int endTime) {
this.endTime = endTime;
}
public void setInterceptorPage(String interceptorPage) {
this.interceptorPage = interceptorPage;
}
public int getStartTime() {
return startTime;
}
public int getEndTime() {
return endTime;
}
public String getInterceptorPage() {
return interceptorPage;
}
/*q行拦截处理*/
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler)throws Exception
{
Calendar cal = Calendar.getInstance();
int hour = cal.get(java.util.Calendar.HOUR_OF_DAY);
if( hour > startTime && hour < endTime)
{
request.setAttribute("startTime", this.getStartTime());
request.setAttribute("endTime", this.getEndTime());
RequestDispatcher rd = request.getRequestDispatcher(this.getInterceptorPage());
rd.forward(request, response);
return false;
}
else
{
return true ;
}
}
}
-----------------------------------------------------------------------------------------------------------------