Tuscany SCA发布Web Service,这篇文章讲了Tuscany 如何发布Web Service。本文介绍如何与常用的框架spring/hibernate整合。
Tuscany SCA与Spring结合官方的方法和解释详见:使用 Spring Framework 设计和开发 SCA 组件,第 1 部分: 三剑客:Spring、SCA 和 Apache Tuscany、使用 Spring Framework 设计和开发 SCA 组件,第 2 部分: 使用 Apache Tuscany 的高级技巧。但是配置太复杂了,直接弄昏我了。还可参考这位仁兄的SCA(Tuscany)+Spring+Hibernate使用范例V0.1,但依然是spring配置和composite配置一个接一个,重复嫌疑。现给出一个在Tuscany SCA 发布Web Service的基础上略加修改得到的一个方法。
本实例使用了Tuscany-sca-1.6.2(不建议使用2.0,因为版本不稳定,教程较少,练习中诸多不便),spring 3.0.5,Hibernate 3.6.5。分别可以在官方网站下载。
1.新建”动态web项目“
参考《Spring2.0技术手册》读书笔记八-Spring与Hibernate整合,配置好spring与Hibernate。
2. Tuscany 发布服务
3.有创新的部分,服务对DAO类的获取
StudentDAO
public class StudentDAO extends BaseDAO { private static StudentDAO instance=null; public static StudentDAO getInstance(){ return instance; } public StudentDAO(){ instance=this; } }
补:BaseDAO是一个DAO基类,封装了一般的增删改查方法。
服务使用DAO:tuscany与spring/hibernate整合的官方方法复杂就复杂在对DAO的获取,完全通过配置让tuscany与spring交互,需要把dao也发布成component。
StudentServiceImpl
public class StudentServiceImpl implements IStudentService{ private StudentDAO studentDao; public StudentServiceImpl(){ studentDao=StudentDAO.getInstance(); } @SuppressWarnings("unchecked") public List<Student> getAll(){ return (List<Student>)studentDao.findAll(Student.class); } }
注:通过代码而不是配置来获得DAO,简化了不少事。那StudentDAO中的静态属性(private static StudentDAO)什么时候被初始化的呢?
4.重要的配置文件
applicationContext.xml中关于DAO的部分
<bean id="studentDAO" class="com.test.dao.StudentDAO"> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property> </bean>
student.composite
<service name="StudentService" promote="StudentServiceComponent"> <interface.java interface="com.test.service.IStudentService" /> <binding.ws></binding.ws> </service> <component name="StudentServiceComponent"> <implementation.java class="com.test.serviceImpl.StudentServiceImpl"/> </component>
web.xml
<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext*.xml</param-value> </context-param> <filter> <filter-name>encodingFilter</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> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <!-- tuscany --> <filter> <filter-name>tuscany</filter-name> <filter-class>org.apache.tuscany.sca.host.webapp.TuscanyServletFilter</filter-class> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>tuscany</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
5.项目结构图
6.项目发布到tomcat下,输入http://localhost:8080/SCASpringHibernate/StudentService?wsdl可以看到studentservice的wsdl,我用flex的WebService组件调用StudentService的getAll方法测试成功。
重点解释:在启动应用时,服务器根据web.xml加载相应的监听器、过滤器等。spring的ContextLoaderListener根据applicationContext.xml初始化了其中的DAO,即StudentDAO中的静态实例(private static StudentDAO instance)在应用启动成功后已经存在容器(内存)中。所以在StudentServiceImpl中调用StudentDAO.getInstance()静态方法可返回一个StudentDAO实例。不知道有没有说清楚,但这个方法是否合理,我觉得还可以讨论。
项目下载地址:http://download.csdn.net/source/3454636
补充:当然不只是DAO可以这样使用了,其他的Bean也可以采用这个”静态实例“的方法来实现。对于工具类(不包含状态信息)倒可以放心使用,如果一个Bean有自己的状态信息,那整个应用都共享这个静态实例就不是一个好方法了!