|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
自己的整个学习思路完全被老师的讲课思路所牵制,这样几节课听下来,恐怕自己的见解都应该是书里的知识点了,根本谈不上自身发现问题,分析问题,和解决问题能力的切实提高。 浏览提纲EJB3.0标准的终极稿已提交到JCP,假如不出不测EJB3.0将在2006年正式公布。本文作为切磋EJB3.0大众草案三系列中的第一篇,将注释EJB3.0和企业Bean组件的基础观点;别的,你还进修到如何利用JBoss和Maven来开辟基于EJB3.0的企业级bean组件。
只管EJB3.0标准还没有正式刊行,可是它已在Java开辟社群中引发普遍乐趣――不管是对其反对者仍是其合作敌手。一切人都供认急切必要找到更有临盆效力的软件开辟办法;现在,他们的争辩会合于在EJB3.0。
只管存在争辩,可是EJB3.0标准草稿的刊行和在JBoss的开端撑持意味着如今恰是探究这类深具影响力的手艺的时分。现实上,有关在临盆体系中使用EJB3.0的呈报早已浮出水面。
本文是切磋EJB3.0大众草案三系列中的第一篇。本文将向你先容该草案中的一些专门观点并将同你一同用JBoss来完成这些详细的手艺。别的,本文还触及一些EJB3.0和企业Bean组件的基础观点。
为此,你必要作以下筹办:
・Java2SDK1.5
・Maven2.0
・JBoss使用程序服务器4.0.3
・JBossAOP1.3.4
1、EJB3.0简介
企业级使用程序是如许一类使用程序-它们完成贸易功效并包括大批的数据。这些使用程序一样平常不在伶仃的情况中实行义务,取而代之的是,它们傍边的每段程序常常成为复杂的IT体系的一个小小的构成部分而且必需与人和别的的体系举行交互。简而言之,开辟企业级使用程序是一件相称难的事变。在几近一切的企业级使用程序中,为了在企业中乐成地实行它们的功效,必需夸大如功能,可伸缩性,并发性和平安性等一系列的成绩。
作为对这些应战的回应,为了更简单地开辟散布式的面向对象的贸易体系,在1998年3月,发生了EJB规格仿单。该规格仿单和完成它的使用程序服务器已在很年夜水平上完成了这个方针。可是,在已往的几年中,EJB的不敷和跟着更简化完成体例的呈现,渐渐提出了良多成绩-是不是EJB可以为企业级使用程序的临盆力开辟供应最好的办理计划?
EJB常常被说起的不敷包含以下:
・假如想使用供应的企业服务的组件就必要利用大批的EJBAPI。
・它是一种要末全有要末全无的发起。就算你想要利用一种EJB服务,你也必需利用一切陪伴EJB的别的内容。
・EJB组件请求有响应的容器而且被证实是难于测试的。
・请求每一个EJB完成多少内容(接口,类和形貌符)。
・传统型EJB架构很少触及面向对象而且引进了只要形态而没有举动的"假对象"。
关于EJB的一些盛行选择有:
・面向方面编程(AOP)
・轻量级容器,如Spring,PicoContainer和Hivemind
・对象干系映照(ORM)工具,如Hibernate,JDO和iBatis
・.NET服务组件
EJB3.0规格仿单大众草案次要目标是使开辟更加简单并使得均衡企业服务更加复杂。这些改善在某种水平上得益于以上所枚举内容的乐成使用。下面工具的某些方面在EJB3.0还留有它们的踪影:
・一个POJO(一般Java对象)编程模子
・一个轻量级ORM延续性框架
・依附性注进
・元数据注解
在EJB3.0规格仿单中,别的一些主要构成包含:
・经由过程非常举行设置
・打消组件接口
・打消home接口
・反省非常利用的削减
本文假定你已熟习EJB2.x而且会存眷在3.0规格仿单大众草案中所引进的新的变更。本文余下的部分将经由过程利用Maven和JBoss使用程序服务器来剖析构建EJB3.0使用程序的过程当中的这些改善。
2、使用程序实例-一个在线音乐店
本文中所会商的手艺全体展示在所附的示例使用程序中-一家在线音乐店。这家店同意用户扫瞄和购置音乐,视频和音频书本。显现出这个界面的一个屏幕快照;你能够下载本文最初有关的源代码。
.音乐店:该音乐店同意扫瞄的产物能够被增加到一个购物车上并终极完成购置。
这个示例程序展现了一切的三品种型的企业bean组件的利用,即无形态会话beans,有形态会话beans和动静驱动的beans。注重,在EJB3.0规格仿单中,实体beans不再和会话beans及动静驱动的beans一样被看成企业bean组件。代之的是,它们被以为是延续性实体(这将在我的下一篇有关EJB3.0延续性的文章中先容)。中的类图是一个如何用EJB完成该音乐店使用程序的初级展现。
.音乐店计划:在这个web使用程序中,哀求是用一个Struts举动来处置的-这个举动利用两个EJB(一个无形态,一个有形态)来完成哀求。在付款台,主顾的购物车经过JMS传送到一个以一个MDB情势完成的定单处置器。
本文相随的实例使用程序的计划和测试工具有:JBoss使用程序服务器4.0.3和JBossAOP1.3.4,而且利用Maven2.0来构建这个使用程序。所附源代码为设置Jboss、利用Maven构建源文件和公布该使用程序均供应了引导。
<P> 3、无形态会话Beans
与EJB3.0规格仿单中的别的一些企业bean组件一样,无形态会话beans是一些完成了一个贸易接口的POJO。以我们的音乐店为例:该音乐店完成在用户扫瞄时对各类范例的音频和视频的查询功效。对这个音乐店来讲,完成这一功效的一个复杂的接话柄现能够以下编写:
publicinterfaceIMusicStore{
publicList<Genre>listGenres();
publicGenrefindGenreById(intid);
publicArtistfindArtistById(intid);
publicProductfindProductById(intid);
publicvoidcheckOut(IShoppingCartcart);
}
而且上面是这类情形的一个复杂完成:
publicclassMusicStoreimplementsIMusicStore{
publicList<Genre>listGenres()
{returnMusicStoreDAO.getInstance().listGenres();}
publicGenrefindGenreById(intid)
{returnMusicStoreDAO.getInstance().findGenreById(id);}
publicArtistfindArtistById(intid)
{returnMusicStoreDAO.getInstance().findArtistById(id);}
publicProductfindProductById(intid)
{returnMusicStoreDAO.getInstance().findProductById(id);}
publicvoidcheckOut(IShoppingCartcart)
{...}
}
在EJB2.x中,假如你想要使用企业服务的长处,如声明性事件办理或对象散布,那末你必需修正该音乐店以完成javax.ejb.SessionBean接口和在这个接口中界说的办法;别的,还要创立当地的和远程的bean和home接口。
在EJB3.0中,一个类要被扩大为一个无形态会话bean必需满意上面两个基础请求:
1.完成最少一个贸易接口。
2.被用@javax.ejb.Stateless注解所注解。
一个贸易接口仅是一个一般的Java接口。个中,java.io.Serializable和java.io.Externalizable接口都被主动地疏忽,由于这些都是在javax.ejb包中的接口。假如只要一个接口被指定,那末它就被假定为一个当地接口。这是在规格仿单的设置中独一的一个例子。假如这个bean有多于一个的贸易接口,那末每一个接口必需被显式地界说为当地的或远程的-经由过程注解这个bean类大概经由过程注解这些接口自己。
因而,为了把MusicStore类做成为一个无形态的会话bean,仅需做一个改动。你必需用@Stateless注解来注解它。
@Stateless
publicclassMusicStoreimplementsIMusicStore{...}
与EJB3.0相干的另外一个次要变更实践上是一个J2EE1.5规格仿单中的变更-依附性注进。J2EE1.5规格仿单请求,J2EE使用程序客户、企业beans和web组件都能够存取一个JNDI定名情况。该定名情况能够被存取,大概经由过程显式的JNDI查找挪用或经由过程指定容器将主动注进依附性的注解。这意味着,如今你能够经由过程一个以下的复杂注解声明一个对一个EJB或别的由容器办理的资本的依附性:
importcom.devx.musicstore.IMusicStore;
publicabstractclassAbstractStoreActionextendsAction{
@EJB
protectedIMusicStorestore;
...
}
就是如许!该容器将把接口ImusicStore的一个完成注进到该举动中,而该举动可使用这个存储对象,就象它是一个复杂的POJO一样。
作者注:
在JBoss4.0.3版本中还没有完成针对web组件的资本注进功效,只管这类撑持行将呈现(http://jira.jboss.com/jira/browse/EJBTHREE-212)。该实例代码包括一个方面-用JBossAOP写成,它完成了依附性注进。
实在面前真正举行的是,这个注解指定把一个到范例IMusicStore的EJB参考注进到store字段中。该依附性的方针并没有指定,因而必需由公布者来供应-就象利用传统型的资本参考一样。假如没有指定依附性名字(如下面例子中所示),那末就假定是利用类的完整限定的定名。在下面的实例中,这将是java:comp/env/com.devx.musicstore.IMusicStore。
作者注在缺省地利用EJB参考的名字时,在有关是不是利用不限定的或完整限定的类定名的成绩上在EJB3.0和J2EE1.5规格仿单存在一些歧义。EJB3.0大众草案指定不限定的bean类定名,而J2EE1.5草案显现了一个完整限定的定名示例。JBoss完成利用完整限定的定名。
作为选择,你能够以下体例来进一步提练这类依附性的声明:
publicabstractclassAbstractStoreActionextendsAction{
@EJB(
name="ejb/musicStore",
beanName="store1",
BusinessInterface=com.devx.musicstore.IMusicStore.class
)
protectedIMusicStorestore;
...
}
在此,对EJB参考的存取是经由过程在java:comp/env/ejb/musicStore的JNDI完成的。
<P> 4、远程接口
为了远程存取一个会话bean,你仅必要用以下的@Remote注解来对它举行注解便可:
@Stateless
@Remote
publicclassMusicStoreimplementsIMusicStore
{...}
在下面的实例中,MusicStorebean仅仅完成了一个贸易接口;既然这个类被指定为远程的,以是我们假定它是远程的。不然,假如MusicStore完成了两个贸易接口,那末你将被请求指定哪一个接口是当地和哪一个接口是远程的。为此,你可使用上面两种办法中的一种:在类上或在接口上。改动MusicStore类来利用一个远程接口的情形以下所示:
@Stateless
@Local({IMusicStore.class})
@Remote({IMusicStoreRemote.class})
publicclassMusicStoreimplementsIMusicStore,IMusicStoreRemote
{...}
你能够把下面的办法与在一个接口上指定的办法举行对照:
@Remote
publicinterfaceIMusicStoreRemote
{...}
注重,远程接口并没有抛出RemoteExceptions非常。假如一个非常在协定级上呈现,那末一个包装了RemoteException的EJBException非常将由容器抛出。作为一个RuntimeException非常,EJBException不必要在远程接口的办法署名或在它的完成bean类中声明。
5、有形态的会话beans
有形态的会话beans与无形态的会话beans有十分类似的需求。就象无形态的会话beans,它们必需最少有一个贸易接口。但是,它们被代之用@Stateful注解所注解。因而在音乐店实例中,用户的购物车已被建模为一个有形态的会话bean-既然它形貌了用户和服务器之间的有形态的会话:
@Stateful
publicclassShoppingCartimplementsIShoppingCart
{...}
如在EJB2.x中一样,挪用不异的到一个有形态的会话bean的参考也是由不异的EJB实例来处置的;如许以来,把这一参考存储到一个可以被客户不休读取的地位就显得极其主要。在音乐店情形下,这个参考存储在用户的HttpSession中。
6、动静驱动的Beans
动静驱动的Beans(MDB)还要完成一个贸易接口而且被注解以唆使它们的bean范例。但是,在这类情形中,该贸易接口并非来自于域而是来自于一个针对所用动静体系范例的得当的听者接口。在JMS的情形下,这是javax.jms.MessageListener。这个音乐店的定单处置器供应一实例:
@MessageDriven
publicclassOrderProcessorimplementsMessageListener{
publicvoidonMessage(Messagemessage){
ObjectMessageobjectMessage=(ObjectMessage)message;
try{
Orderorder=(Order)objectMessage.getObject();
System.out.println("ProductsOrdered:");
for(Productp:order.getProducts())
{System.out.println(p.getTitle());}
}
catch(JMSExceptione){e.printStackTrace();}
}
}
就象在EJB2.x一样,你能够给公布者供应关于怎样设置MDB的别的信息。这个信息如今可以经由过程@MessageDriven注解的activationConfig元从来供应。比方,为了界说OrderProcessor仅在JMS动静抵达定单行列时激活,你能够对类举行以下注解:
@MessageDriven(activateConfig={
@ActivationConfigProperty(propertyName="destinationType",propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(propertyName="destination",propertyValue="queue/orders")
})
publicclassOrderProcessorimplementsMessageListener
{...}
可是就象在前一个版本的EJB中一样,公布者将卖力把一个MDB与一个方针或终端相干联。
7、打包和公布
在EJB3.0中的打包与EJB前一个版本中的打包很类似。就象在前一个版本中一样,企业bean类必需被打包成一个.JAR文件。最年夜的分歧在于,在EJB3.0版本中,公布形貌符成为可选的。但是,假如供应一个公布形貌符的话,那末它必需存在于它一般地点地位(META-INF/ejb-jar.xml)。
该示例使用程序展现了构建一个EJB3.0EJB-JAR而且以一个企业档案(EAR)情势把该JAR与web使用程序(WAR)绑定到一同。该构建利用了Maven2.0;更多信息请参考所附源码。
作者注:在Jboss中,EJB3.0jar文件的扩大名为.ejb3-这是一个JBoss常规而并非规格仿单中的请求。
为了公布示例使用程序,只需把了局.EAR文件复制到一个用JBossAOP1.3.4公布器设置的一个JBoss4.0.3服务器的公布目次下。所附源码中也包括安装指令。
8、利用一个简化的模子
EJB3.0大众草案展现了一种创立企业级组件的相称简化的模子。这类新型典范的目标在于简化开辟,只是引进了较少的超越后面会商局限的新功效。但是,EJB3.0所供应的这类简化应当会年夜年夜地加强团队开辟的临盆才能,你将风趣地看到这类新型轻量级完成是如何与别的如Spring和Hibernate等轻量级框架合作的。
你通过从书的数量和开发周期及运行速度来证明:net和ruby要比java简单。 |
|