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

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有自己的状态信息,那整个应用都共享这个静态实例就不是一个好方法了!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值