您的位置:首页 > 编程语言 > Java开发

Tuscany SCA与Spring、Hibernate整合之简洁方法

2011-07-19 21:40 162 查看
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 发布服务

参考Tuscany SCA发布Web Service

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有自己的状态信息,那整个应用都共享这个静态实例就不是一个好方法了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐