使用Spring依赖注入实现方法替换
Posted by eDWARD at 15:42
在ApplicationContext配置文件中配置Bean的时候可以使用replaced-method设置需要替换的方法。replaced-method标签的name属性用来设置需要替换的方法名称,replacer属性用来设置替换方法的Bean,前提是这个Bean需要实现Spring的MethodReplacer接口,replaced-method标签下的元素arg-type用来区分替换方法的参数。
Posted by eDWARD at 15:42
在ApplicationContext配置文件中配置Bean的时候可以使用replaced-method设置需要替换的方法。replaced-method标签的name属性用来设置需要替换的方法名称,replacer属性用来设置替换方法的Bean,前提是这个Bean需要实现Spring的MethodReplacer接口,replaced-method标签下的元素arg-type用来区分替换方法的参数。
Posted by eDWARD at 15:37
ActiveMQ是完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,也是Apache Geronimo默认的JMS provider。
ActiveMQ的网站:http://www.activemq.org
使用ActiveMQ后,可以在普通Web服务器使用JMS功能,不依赖于特定的应用服务器。
ActiveMQ4.1 响应Spring 2.0号召,支持了引入XML Schema namespace的简单配置语法,简化了配置的语句。
在ApplicationContext.xml(Spring的配置文件)中引入ActiveMQ的XML Scheam 配置文件),如下:
(说明:由于ActiveMQ的那个XSD有部分错误,因此使用的是自行修改过的XSD,见”配置ClassPath中的scheam”小节)
在ClassPath 下面建立META-INF\spring.schemas 内容如下
当spring初始化时候,ActiveMQ embedded Broker 就会启动了
配置ConnectionFactory,由于是embedded 所以URL为:vm://localhost
配置Queue名字
配置JmsTemplate
配置MDP POJO
Posted by eDWARD at 15:26
为了测试Spring管理下的Bean,可以自行构造BeanFactory,也可以继承于AbstractDependencyInjectionSpringContextTests,实现public String[] getConfigLocations()函数, 返回applicationContext文件路径的数组。
并显式写一些需要注入的变量的setter函数。
tips1:此基类有一个applicationContext的成员变量,所以除了依靠setter注入外,还可以随时用applicationContext.getBean() 取出所需的bean。
tips2:注意此基类默认是autowire by type的,所以如果context文件里有两个相同类型的Bean就会报错,可能需要在getConfigLocations()函数里,setAutowireMode(AUTOWIRE_BY_NAME);把它设回by name,或者取消setter函数,自行用applicationContext.getBean()来显式查找Bean。
AbstractTransactionalDataSourceSpringContextTests 继承于AbstractDependencyInjectionSpringContextTests,除了拥有上类的能力外,还管理了每个测试的事务,会在每个测试后默认回滚所有的操作。
深层解释,此类的实现其实依赖于Application Context中定义的PlatformTransactionManager。由于使用了autowire by type,可以任意取名。
另依赖于Application Context中定义的DataSource,同样可以任意取名。
tips1:如果需要在测试后提交,需要setRollBack(false); 或者调用setComplete()
tips2:此基类还通过注入的DataSource创建了一个JDBCTemplate 变量,可以跑SQL帮忙核对Hibernate的结果,Spring将确保该查询在同一个事务内执行。为正常工作你需要告诉你的ORM工具’刷新’它的已改变内容,例如使用Hibernate Session 接口的 flush() 方法。
tips3:除了tips2以外,还有countRowsInTable(String tableName),deleteFromTables(String[] names) ,executeSqlScript(String sqlResourcePath, boolean continueOnError)三个简便函数。
Controller测试一般要用MockObject 分离Service层,要copy WEB-INF/下的相关文件copy 到classpath,而且Controller不含太多的逻辑,所有测试controller有点吃力不讨好,建议直接用selenium进行集成测试。见(Selenium测试概述)。
因为Spring默认的基类名字较长,SpringSide 在core 的org.springside.core.test 中重新继承了它们,并提供了按springside的context文件存放规则,默认读取所有context 文件的getConfigLocations()函数。
默认读取所有context文件的getConfigLocations()函数对速度和测试的隔离化都有影响,可以在子类重新实现。不过自己重新一个个写相关context文件也好烦,而且其实在全lazy-load的情况下,速度也还可以接受。如何取舍要自己平衡了。
对于CRUD的测试,在helloworld示例里的变量名都作了泛化,可以快速copy到另一个测试里。
另外,留意resources/spring/test 下的文件,利用了Spring的PropertyOverrideConfigurer,重新设定测试时的ApplicatonContext 里各个Bean的属性如指定测试用的DataSource,详细用法见Spring配置要点。
phpcode有点排版不便,大家可以看wiki原文。
Posted by eDWARD at 15:25
我们常常借助接口来将调用者与实现者分离。如:
上面的代码中,ClassA依赖于InterfaceB的实现,如何获得InterfaceB实现类的实例?传统的方法是在代码中创建InterfaceB实现类的实例,并将起赋予clzB。
而这样一来,ClassA在编译期即依赖于InterfaceB的实现。为了将调用者与实现者在编译期分离,于是有了上面的代码,我们根据预先在配置文件中设定的实现类的类名,动态加载实现类,并通过InterfaceB强制转型后为ClassA所用。
这就是接口注入的一个最原始的雏形。
而对于一个Type1型IOC容器而言,加载接口实现并创建其实例的工作由容器完成,如J2EE开发中常用的Context.lookup(ServletContext.getXXX),都是Type1型IOC的表现形式。
Apache Avalon是一个典型的Type1型IOC容器。
构造子注入,即通过构造函数完成依赖关系的设定,如:
可以看到,在Type2类型的依赖注入机制中,依赖关系是通过类构造函数建立,容器通过调用类的构造方法,将其所需的依赖关系注入其中。
PicoContainer(另一种实现了依赖注入模式的轻量级容器)首先实现了Type2类型的依赖注入模式。
在各种类型的依赖注入模式中,设值注入模式在实际开发中得到了最广泛的应用(其中很大一部分得力于Spring框架的影响)。
在笔者看来,基于设置模式的依赖注入机制更加直观、也更加自然。Quick Start中的示例,就是典型的设置注入,即通过类的setter方法完成依赖关系的设置。
接口注入模式因为具备侵入性,它要求组件必须与特定的接口相关联,因此并不被看好,实际使用有限。
Type2和Type3的依赖注入实现模式均具备无侵入性的特点。在笔者看来,这两种实现方式各有特点,也各具优势(一句经典废话?)。
可见,Type2和Type3模式各有千秋,而Spring、PicoContainer都对Type2和Type3类型的依赖注入机制提供了良好支持。这也就为我们提供了更多的选择余地。理论上,以Type2类型为主,辅之以Type3类型机制作为补充,可以达到最好的依赖注入效果,不过对于基于Spring Framework开发的应用而言,Type3使用更加广泛。
Posted by eDWARD at 15:22
Spring可以在容器加载时在web.xml中配置filter来进行转发过滤,因为我把html作为screen的映射后缀,所以这里可以根据你的情况设置为*.jsp或*.action等等。
如果你用到了任何properties配置文件,那么就需要通过java/bin/native2ascii统一转码为utf-8编码方式
所有被渲染的view层的页面顶部增加下面的代码
Posted by eDWARD at 15:20
首先是配置文件:(conf/mail.xml)
发送邮件的类:
测试发送类:
Posted by eDWARD at 17:30
方法一
字段类型为java.sql.Clob。dataobject & xdoclet:
hbm.xml:
方法二
DataObject中的数据成员类型为String,映射的数据库字段类型为org.springframework.orm.hibernate.support.ClobStringType
Xdoclet:
hbm.xml:
如果使用spring的这个clob类型就需要在applicationContext.xml中的sessionFactory里修改如下配置
这两只方式在采用oracle thin方式连接的情况下都有传输限制,解决方法是采用oci连接方式(jdbc:oracle:oci10:@sid)
hbm.xml:
前提是要提供SEQ:)