我以前用过EJB3.0开发过两个项目,除了它依赖于服务器容器的重量级外,我并没有看到它所谓的侵入性,所以当看到资料说EJB是侵入性的时候,会感到难以理解,因为使用EJB3的时候甚至感觉它比Spring还要好用。
但想不到2011年的今天,我竟然还能使用ejb2.0开发项目,虽则痛苦,其实也算是一种幸运吧。
至少让我体会到了遭到口诛笔伐的EJB2的侵入性,同时越是使用老的技术,才有更接近于原理之感,现贴上一个小例子,是自己写的ejb2的helloworld,只因网上并无实质资料,所以虽则简单,犹以能助后来者。
1,在ejb工程下,新建一個sessionbean:HelloBean,
package com.zjx;
/**
* Bean implementation class for Enterprise Bean: Hello
*/
public class HelloBean implements javax.ejb.SessionBean {
static final long serialVersionUID = 3206093459760846163L;
private javax.ejb.SessionContext mySessionCtx;
/**
* getSessionContext
*/
public javax.ejb.SessionContext getSessionContext() {
return mySessionCtx;
}
/**
* setSessionContext
*/
public void setSessionContext(javax.ejb.SessionContext ctx) {
mySessionCtx = ctx;
}
/**
* ejbCreate
*/
public void ejbCreate() throws javax.ejb.CreateException {
}
/**
* ejbActivate
*/
public void ejbActivate() {
}
/**
* ejbPassivate
*/
public void ejbPassivate() {
}
/**
* ejbRemove
*/
public void ejbRemove() {
}
public void sayHello() {
System.out.println("Hello World!");
}
}
2,会在client中生成一个Hello接口,在其中添加一个sayHello() 方法。
3,发布EAR文件,会自动生成多个java文件,且不必管。
4,配置文件信息:
<display-name>
testEJB</display-name>
<enterprise-beans>
<session id="Hello">
<ejb-name>Hello</ejb-name>
<home>com.zjx.HelloHome</home>
<remote>com.zjx.Hello</remote>
<ejb-class>com.zjx.HelloBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
<ejb-client-jar>testEJBClient.jar</ejb-client-jar>
5,新建测试工程,类如下:
public static void main(String[] args) throws NamingException,
RemoteException {
String JNDIName = "ejb/com/zjx/HelloHome";
InitialContext initContext = new InitialContext();
Object obj = initContext.lookup(JNDIName);
HelloHome home = (HelloHome) javax.rmi.PortableRemoteObject.narrow(obj,
HelloHome.class);
try {
Hello hello = home.create();
hello.sayHello();
} catch (CreateException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
测试成功,不过需要注意的是main方法只能测试remote,如果要测local宜用web。