ejb3.0基础

1.EJB的三种bean:

1>会话bean(Session Bean)--负责与客户端交互,是编写业务逻辑的地方。在会话bean中要可以直接通过JDBC操作数据库,但大多数情况通过实体bean完成对数据库操作

a.无状态会话bean(使用较多),它的实例可以供多个用户使用,所以它的性能比有状态bean高,而正因为一个bean实例被多个用户使用,所以前一个用户设置的值可能会被后一个用户所修改,因而它无法正确保存某个用户设置的值,所以它是无状态的

b.有状态会话bean(使用较少),因为它的一个实例只供一个用户使用,所以性能开销比较大,每个用户设置的值 不会被其他的用户所修改,所以可以正确每个用户设置值,因而它是有状态的

2>实体bean(entity bean)---Java持久化规范技术,类似于hibernate中与数据库表映射的bean

3>消息驱动bean(message-driven bean)--专门用于异步处理java消息的组件,具有大量处理并发消息的能力

2.开发无状态会话bean:

1>开发接口:

public interface HelloWorld {
	public String sayHello(String name);
}
2>开发无状态bean实现接口

@Stateless//bean类是无状态bean
@Remote(HelloWorld.class)	//远程接口
public class HelloWorldImpl implements HelloWorld {

	@Override
	public String sayHello(String name) {
		return name+" say hello";
	}

}
3>开发客户端,此处的客户端不需要与服务端处于同一台计算机上,只需要修改其中连接的服务器IP地址和启动Jboss时绑定相应的IP地址就可以了,这就是EJB的远程调用特性。

public static void main(String[] args) {
		//JNDI服务的配置信息
		Properties properties=new Properties();
		properties.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
		properties.setProperty("java.naming.provider.url", "localhost:1099");
		try {
			Context context=new InitialContext(properties);
			//获取无状态bean的代理
			HelloWorld helloWorld=(HelloWorld)context.lookup("HelloWorldImpl/remote");
			System.err.println(helloWorld.sayHello("cash"));
		} catch (NamingException e) {
			e.printStackTrace();
		}
	}
4>Jboss默认生成的JDNI名称:

a.当EJB发布到Jboss时,没有为它指定全局JNDI名称或修改其默认EJB名称,Jboss就会按照默认的命名规则为EJB生成全局JNDI名称,默认规则如下:

本地接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/local

远程接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/remote

(EAR-FILE-BASE-NAME为ear文件的名称,EJB-CLASS-NAME为EJB的非限定类名,不包含包名)
例如:把HelloWorld应用作为EJB模块打包进名为HelloWorld.ear的企业应用文件,它的远程接口的JNDI名称是:HelloWorld/HelloWorldImpl/remote

b.如果把EJB应用打包成后经为*.jar的模块文件,默认的全局JNDI名称是

本地接口:EJB-CLASS-NAME/local

远程接口:EJB-CLASS-NAME/remote

例如上面的代码。

你可能感兴趣的:(ejb3.0基础)