EJB——会话bean(一)

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情
       会话bean的目的是建模业务处理或者操作,特别是系统用户能察觉到的。会话bean是EJB中最容易但也最通用的部分。
会话bean有两种类型:无状态类型和有状态类型。
无状态bean
package com.ejb3inaction.actionbazaar.buslogic;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import com.ejb3inaction.actionbazaar.persistence.Bid;
@Stateless//将POJO标记为会话bean
public class PlaceBidBean implements PlaceBid {
···
public PlaceBidBean(){}
public Bid addBid(Bid bid) {
System.out.println("Adding bid, bidder ID=" + bid.getBidderId()
+ ", item ID=" + bid.getItemId() + ", bid amount="
+ bid.getBidPrice() + ".");
return save(bid);
}
···
}
}
···
package ejb3inaction.example.buslogic;
 
import javax.ejb.Local;
import ejb3inaction.example.persistence.Bid;
 
@Local//将EJB业务接口标记为本地的
public interface PlaceBid {
Bid addBid(Bid bid);
}
        这段代码中值得注意的特性是两个EJB 3注解:@Stateless和@Local。无状态会话bean用于建模可以一次性完成的操作或处理。
  • @Stateless注解通知EJB容器这个bean是无状态会话bean。容器自动的为bean提供这些服务并发控制、线程安全、池化和事务管理。此外,你可以添加适用于无状态bean的其他服务,比如透明安全和拦截器。
  • @ Local注解通知容器可以通过接口访问PlaceBid EJB。因为EJB和servlet通常在同一个应用程序中协同操作,所以这种方式非常好。另一种方式是,你可以使用@Remote注解标记接口。在Java远程方法调用(RMI)的控制下提供对@Remote进行远程访问,这是从Java客户端进行远程访问的理想方式。
       如果非Java客户端(如.NET应用程序)需要访问EJB,可以在接口或bean类上使用@WebService注解,从而启动基于Web服务的远程访问。
无状态bean客户端
客户端调用上面的PlaceBid EJB,可能从JSP或servlet中调用,假设是在servlet中调用,代码如下:
package ejb3inaction.example.buslogic;
import javax.ejb.EJB;
import ejb3inaction.example.persistence.Bid;
 
 
public class PlaceBidClient {
@EJB//注入PlaceBid EJB的实例
private static PlaceBid placeBid;
public static void main(String [] args) {
try {
Bid bid = new Bid();
bid.setBidderId("npanda");
bid.setItemId(Long.valueOf(100));
bid.setBidPrice(20000.40);
 
System.out.println("Bid Successful, BidId Received is:" +placeBid.addBid(bid).getBidId());
} catch (Exception ex) {
ex.printStackTrace();
}
}
 
}
        当servlet容器第一次加载servlet发现@EJB注解时,它将在幕后查找PlaceBid EJB并把placeBid变量设置为可获得的EJB引用。如果有必要,容器会通过RMI远程查找EJB。
PlaceBid无状态bean的一个有意思的地方就是只要每次调用addBid方法并导致创建新的记录时,客户端不关心bean的内部状态。完全不需要无状态bean保证其任何实例变量的值在任意两次调用之间是相同的,这就是无状态的意义。
有状态bean
        与无状态bean不同,有状态bean保证客户端可以设置bean的内部状态,希望在任意次调用之间维护状态。容器确保通过在幕后进行一下两个重要的操作来达到目的。
  • 首先,容器确保客户端可以跨越一次以上的方法调用访问分配到容器的bean,比如打电话,如果你在给定的时间(此时间就是会话)内给技术支持打电话的次数超过1次,它能确保你和同一个客服代表通话。
  • 其次,容器确保在会话过程中维护bean实例的变量值,无需你编写任何会话维护代码。
        举一个订单处理的例子,购物订单处理流程是添加商品,设置商品信息,确认订单,我们建一个类PlaceOrderBean,从Web层依次调用addItem、setShippingInfo、setBillingInfo和confirmOrder方法,对用户在每个步骤中的操作做出响应。除了confirmOrder方法之外,其他方法都是将用户输入保存到有状态实例变量中。confirmOrder方法使用会话中积累的数据进行如下操作:把完成的订单保存到数据库中,并进行账单处理,把账单id返回给用户确认。代码如下:
package com.ejb3inaction.actionbazaar.buslogic;
 
import java.util.ArrayList;
import java.util.List;
import javax.ejb.*;
 
@Stateful//使用POJO有状态
public class PlaceOrderBean implements PlaceOrder {
private Long bidderId;
private List<Long> items;
private ShippingInfo shippingInfo;
private BillingInfo billingInfo;
 
public PlaceOrderBean() {
items = new ArrayList<Long>();
}
 
public void setBidderId(Long bidderId) {
this.bidderId = bidderId;
}
 
public void addItem(Long itemId) {
items.add(itemId);
}
 
public void setShippingInfo(ShippingInfo shippingInfo) {
this.shippingInfo = shippingInfo;
}
 
public void setBillingInfo(BillingInfo billingInfo) {
this.billingInfo = billingInfo;
}
 
@Remove//包含删除方法
public Long confirmOrder() {
Order order = new Order();
order.setBidderId(bidderId);
order.setItems(items);
order.setShippingInfo(shippingInfo);
order.setBillingInfo(billingInfo);
saveOrder(order);
billOrder(order);
return order.getOrderId();
}
···
}
···
package com.ejb3inaction.actionbazaar.buslogic;
 
import javax.ejb.Remote;
 
@Remote//定义远程业务接口
public interface PlaceOrder {
void setBidderId(Long bidderId);
void addItem(Long itemId);
void setShippingInfo(ShippingInfo shippingInfo);
void setBillingInfo(BillingInfo billingInfo);
Long confirmOrder();
}
       从代码上看,开发无状态和有状态bean的区别不大。但是容器在处理bean和客户端之间关系以及存储在bean实例变量中的值等方面的区别是很大到。
       @Remove注解也很重要。此注解是可选的,但是对服务器的性能来说,它很重要。此注解用于标记有状态bean建模的工作流的结束。例子中我们通知容器调用confirmOrder方法之后就不在需要维护与客户端的bean会话。如果我们没有通知容器哪个方法用于标记工作流的结束,那么在容器安全的使会话超时之前,他就会等待很长时间。因为有状态bean保证在会话的过程中被指派给客户端,这可能意味着在很长的时间周期内,大量“孤立”状态数据在消耗宝贵的服务器资源!
有状态bean客户端
package com.ejb3inaction.example.buslogic;
 
import javax.ejb.EJB;
 
public class PlaceOrderClient {
@EJB//注入EJB的实例
private static PlaceOrder placeOrder;
 
public static void main(String[] args) {
try {
Context context = new InitialContext();
placeOrder = (PlaceOrder) context.lookup("chapter2/"
+ PlaceOrderBean.class.getSimpleName() + "/remote");
 
System.out.println("Exercising PlaceOrder EJB...");
placeOrder.setBidderId(new Long(100));
placeOrder.addItem(new Long(200));
placeOrder.addItem(new Long(201));
placeOrder.setShippingInfo(new ShippingInfo("123 My Sweet Home",
"My City", "My State"));
placeOrder.setBillingInfo(new BillingInfo("VISA", "123456789",
"0708"));
Long orderId = placeOrder.confirmOrder();
System.out.println("Added Order: " + orderId);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
       除了客户可以安全的假设即使EJB在远程应用程序服务器上也可以维护状态之外,使用无状态和有状态bean的客户代码之间没有区别。值得注意的是,在有状态客户端中@EJB注解把远程EJB注入到独立客户端中。这是通过应用程序客户端容器(application client container,ACC)中运行客户端完成的。
       任何具有main方法的Java类都可以运行在ACC之内。但是,通常情况下,应用程序客户端打包在JAR文件中,此文件必须在Manifest文件中包含Main-Class。可选方式是,JAR文件可以包含部署描述文件(application-client.xml)和jndi.properties,它们包含连接在远程EJB容器的环境属性。

EJB学习笔记——会话Bean 1.EJB3简介:EJB是企业级java bean(Enterprise Java Bean)开发技术,是基于IIOP协议的分布式远程方法调用技术(RMI)EJB3在JavaEE5中被正式引入,去掉了EJB2以前的复制度,使得EJB3更加轻量级,同时将实体Bean单独分拆成为JPA规范,从而使EJB3更加专注于会话Bean和消息驱动Bean的业务逻辑,同时EJB3中全面支持java注解方式,大大简化开发的难度提高开发效率。2.在客户端调用个简单EJB3程序:首先使用个简单例子演示客户端调用EJB3的基 阅读详情

相关推荐

EJB——会话bean(二)

为什么使用会话bean 1.并发和线程安全        构造服务器端应用程序的重点在于可以是客户端同时共享,会话bean用于处理客户端请求,他们支持高并发。容器利用很多技术“自动”确保你不必担心并发和线程安全方面的问题。 2.远程处理Web服务        会话bean支持基于Java远程方法调用的本地访问和基于简单对象访问协议(Simp

徐凤竹 程序人生 1564

关于有状态和无状态会话bean的解释

NULL 博文链接:https://caizhongda.iteye.com/blog/341007

国产MCU替代STM32的5个隐藏坑:从Pin-to-Pin兼容到电气参数差异全解析

在嵌入式开发中,MCU选型往往决定项目成本与供应链稳定性。随着国产芯片崛起,越来越多团队开始评估用GD32、AT32、APM32等型号替代传统STM32方案。然而,所谓的Pin-to-Pin兼容只解决了物理封装问题,寄存器映射、时钟树配置、电气特性乃至Flash擦除机制都可能存在隐性差异。从GPIO灌电流能力到BOOT引脚内部上下拉,从HSE起振失败到外设寄存器位定义偏移,任何个细节都可能导致产品“烧录成功却跑不起来”或“运行数天后莫名故障”。本文结合真实量产项目中的排查经历,系统梳理国产MCU替代过程中

congji3817的博客 418

EJB会话Bean(Session Bean

会话bean封装了可以由客户端通过本地,远程或Web服务客户端视图以编程方式调用的业务逻辑。要访问部署在服务器上的应用程序,客户机将调用会话Bean的方法。会话bean为客户端执行工作,通过在服务器内执行业务任务来避免复杂性。

张姐姐聊编程 857

会话bean

在本文中,将讨论EJB会话Beans的知识——EJB客户端应用程序所用到的核心业务服务对象,有助于理解简单新颖的EJB会话Bean模型。     什么是会话bean?     会话Bean是Java组件,其既可运行于独立的EJB容器中,也可运行于作为标准Java平台、Java EE应用程序服务器部分EJB容器中。这些Java组件通常用于建模某特定用户任务,如输入顾客信息或实现某维持客户端

劝学 2166

国产化替代实战:SpringBoot项目无缝切换MySQL与OpenGauss(附完整配置代码)

本文详细介绍了SpringBoot项目如何实现MySQL与OpenGauss数据库的无缝切换与国产化替代。通过采用dynamic-datasource框架,结合完整的配置代码与实战策略,解决了多数据源动态路由、SQL方言差异、事务管理等核心难题,助力企业级应用平滑迁移至国产数据库。

python9snake的博客 211

Java之旅EJB(2)——三种bean会话bean

前面我们大致讲过ejb是什么,这里不再对定义进行讲解,主要是讲解内部的组成。  1.      Bean分类   会话bean(session bean)   负责与客户端交互,是编写业务逻辑的地方,在会话bean中可以通过jdbc直接操作数据库,但大多数情况下都是通过实体bean来完成对数据库的操作。   实体bean(Entity bean)   它实际上属于java持久化规范(简称

李晓娜 2554

JPA、EJB、事务管理、WebSphere ---相关内容整理

JPA(Java Persistence API)和JDBC类似,也是官方定义的组接口,但是它相比传统的JDBC,它是为了实现ORM而生的,即Object-Relationl Mapping,它的作用是在关系型数据库和对象之间形成个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象样操作它就可以了。■1.1.配置文件JPA persistence.xml 文件初学者指南_allway2的博客-CSDN博客_persistence.xml。

sun0322 2551

EJB3.0读书笔记 之 会话Bean介绍(

1 生命周期:从客户视图看待,Bean实例开始于客户获得其引用时,而终止于客户会话的中介。通常,客户会话(Client Session)的持续期决定了使用中的会话Bean的存活期。会话Bean仅仅是内存对象,旦其生存的周边环境遭到破坏,会话Bean也将不复存在。会话Bean并不是持久化的。实体Bean是持久化对象,是永久性存储源的组成部分。 2 会话Bean的子类型:无状态会话Bean和有

青青木屋 912

EJB的基本分类

1.企业bean (1)session bean(stateless和stateful session bean会话bean:从客户端获得EJB对象开始,然后调用EJB方法,直到客户端释放EJB对象为止。客户端通过JNDI查找EJB对象。若每次会话查找同对象时,则返回不同对象。 对象的状态由它的实例变量的值决定的。 有状态session be...

weixin_30780221的博客 208

EJB中有状态会话Bean 和 无状态会话Bean 的区别

bo_hai的专栏 145

EJB——有状态的会话bean和无状态的会话bean

前面文章介绍过EJB些基本概念和三种bean,今天重点介绍会话bean中的有状态会话bean和无状态会话bean。  会话bean分为有状态的会话bean和无状态的会话bean:有状态会话bean :  每个用户有自己特有的个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;旦用户灭亡(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到个初始的bea

邵鸿鑫 7644

EJB有状态的会话Bean和无状态的会话Bean的区别

EJB里面,会话Bean分为两种,种是有状态的会话Bean,另种是无状态的会话Bean,本节主要讲解下两者之间的区别。        对于有状态的会话Bean,这种情况属于,服务端与你单独开辟了块空间与你进行交互。而客户端感觉服务端单独为他自己服务似的。而无状态的会话Bean,则服务端不提供了个资源但是谁用都行,他不负责。所以客户端在使用的时候,则会感到这个服务 与其他人共享似的。服务

赵崇 2525

详解EJB 3会话Bean

 详解EJB 3会话Bean           在本文中,将讨论EJB 3会话Beans——EJB客户端应用程序所用到的核心业务服务对象,有助于理解简单新颖的EJB 3会话Bean模型,主要涉及以下主题: Ø 会话Bean类型,包括有状态及无状态,及何时该用何种。Ø Bean类、业务接口、业务方法。Ø 通过会话Bean注释符实现的依赖性注入(即资源捆绑)。Ø 

谢启东的专栏 1873

EJB整理2-会话Bean

1 会话Bean<br />Session Bean 是实现业务逻辑的地方。简单地说,像我们要实现两数相加或是从数据库中读取数据,都是通过Session Bean 来实现。根据是否可以维护会话状态,Session Bean 分为有状态 bean 和无状态 bean。有状态 bean 可以维护会话状态,无状态 bean 不维护会话状态。要维护会话状态,意味着 EJB 容器要为每个用户创建bean实例,并通过该实例保存着与用户的会话状态。不维护会话状态,意味着bean 实例不需要保存与某个用户的会话

崇尚狼性的专栏 1282

调用本地会话Bean和远程会话BEAN/EJB

个小的调用本地EJB的作业,不难,接口什么的非常好写,但是由于网上的jndi千奇百怪,而且这个东西太老了,我上课也没听,导致只能搞个远程的,本地的概念什么的都不是很清楚,所以弄了很久。 会有空总结下,主要参考老师的PPT和这两篇博客。 https://blog.csdn.net/u010924834/article/details/51114428 https://blog.c...

qq_38941327的博客 962

EJB基础 无状态会话BEAN使用

EJB基础 无状态会话BEAN使用 EJB是J2EE的条标准。以往EJB被人诟病,缺点是复杂,沉重。然后spring崛起了,spring因其轻量级,开发方便而得到了迅速地推广。但是这是过去了,EJB 2.X确实存在这个特点。但新标准的EJB 3.X却在向轻量级转变,而且开发效率可以说完全与spring相当。 要进行EJB开发,必须有EJB容器,tomcat是默认没有实现EJB的。实现了EJ

ilovewqf的博客 1763
上一篇: EJB通用元数据注解
下一篇: EJB——消息和消息驱动bean(一)
小太阳在发光
博客等级 码龄13年 196粉丝 184原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值