职业炮灰 2012-07-31
Spring是J2EE标准中的一个重要架构,它能有效的组织J2ee各应用层的对象。
在SSH中,Struts主要负责前面客户端提交表单的处理,Spring负责对主要业务的控制管理,Hibernate在最后边,负责数据的持久化,即描述的是POJO与数据库表的关系,尊从ORM模型。
依赖注入和控制反转是同一个概念,在传统程序实际中,调用者想要调用另一个对象需要自己创建被调用者的实例,在Spring中,创建被调用者的工作由Spring容器完成。当调用者需要的时候注入给调用者。
依赖注入有两种:设值注入和构造注入。
设值注入通过setter方法传入被调用者的实例,这种方式在Spring和SCA的配置文件中被大量使用。
在实现类中有如下的定义:
publicclasschineseimplementsPerson{
privateknifeknife;
publicchinese(){}
//设置注入所需的setter方法
publicvoidsetknife()
{
this.knife=knife;
}
//实现Person接口中的useknife()方法
publicvoiduseknife(){
System.out.println(knife.chop());
}
}
//Spring配置文件定义beans部分的主要内容
<beans>
<beanclass=com.zy.chinese//实现类所在的路径,即在哪个包下面id=chinese>
<propertyname="knife">
<REFlocal=""stoneknife"/">//stoneknife是knife接口的一个具体实现类
</bean>
<beanclass=com.zy.stoneknifeid=stoneknife/>
<beans>
//对比SCA架构配置组建的配置文件.composite
<?xmlversion="1.0"encoding="UTF-8"?>
<compositexmlns="http://www.osoa.org/xmlns/sca/1.0"
xmlns:t="http://tuscany.apache.org/xmlns/sca/1.0"
xmlns:c="http://wsTuscany"
targetNamespace="http://wsTuscany"
name="wsTuscany">
<componentname="ClientImpl">
<implementation.javaclass="com.zy.wsTuscanyClient.Client"/>
</component>
<referencename="hello"promote="ClientImpl/hello"target="wsTuscanyHello">
<interface.javainterface="com.zy.services.HelloInterface"/>
<binding.wsurl="http://localhost:8080/axis2/services/HelloZY"wsdlElement="http://services.zy.com/#wsdl.port(HelloInterface/HelloInterfacePort)"/>
</reference>
</composite>
SCA架构中管理的对象是组件,组件可以是本地的一个POJO普通实现类,也可以是外部的ws,本地的组件可以包装成ws供外部调用。
可以看到.composite文件中是由一个个的<compoment>对组成的,spring.xml配置文件中的标签是<bean>,配置文件中的配置规则实际是一样的,她们都是管理框架,只是配置对象的粒度不同。
普通的javabean相当于微软COM模型中的本地进程内的com组件,它是不能被跨进程访问的。EJB相当于DCOM,即分布式组件。它是基于java的远程防范调用(RMI)技术的,所以EJB可以被远程访问(跨进程,跨计算机)。EJB是一组基于分布式事务处理的企业级应用组件,但EJB客户从不直接访问真正的EJB组件,而是通过其容器访问。
容器是一种能够为某种运行对象提供运行环境支持的地方(其实也就是服务器的概念),web容器或者叫web服务器主要是为jsp或servlet提供运行环境支持的,现在符合j2ee标准的EJB被部署在WebSpere、WebLogic这样的容器中。客户访问EJB通常不直接访问而是通过它的代理,即EJB容器去访问。这也符合SCA组件架构模式。基于组件模式的架构都需要一个容器来管理各个组件,在SCA型中这个容器对象就是SCADomain域。
Spring是j2ee规范中最轻量级的容器其次是EJB容器再次是SCA域