EJB框架 详细介绍和注解的使用
一、EJB是什么?
- EJB是sun的JavaEE服务器端组件模型,是一种规范,设计目标与核心应用是部署分布式应用程序。
- EJB2.0过于复杂,EJB3.0的推出减轻了开发人员进行底层开发的工作量,它取消或最小化了很多(以前这些是必须实现)回调方法的实现,并且降低了实体Bean及O/R映射模型的复杂性。
- EJB大概是J2EE架构中唯一一个没有兑现其能够简单开发并提高生产力承诺的组件。
二、EJB3.0新特性
相比EJB3以前的版本而言,增加了两个新特性:元数据注解(Annotation) 和依赖注入(Injection),而元数据注解以最大限度的使部署描述符从冗余繁杂中脱离出来。
三、EJB体系结构
EnterpriseBean和Serializable接口一样,是一个标记性接口。用于标记一个类为一个Bean。它有三种实现:SessionBean,EntityBean,MessageDrivenBean。
SessionBean:它是对业务逻辑的封装,类似于我们经常写的Service层。它可以以local, remote, webservice 服务的方式被client调用。
EntityBean:它是对数据库对象的封装,一个EntityBean,就是数据库的一条记录。
MessageDrivenBean:一个messageDrivenBean其实就是一个javax.jms.MessageListener。在JMS中有MessageConsumer,它支持两种接收消息的方式:同步接收采用MessageConsumer#receive()方法,异步接收则是为MessageConsumer设置一个MessageListener,一旦接收到消息,就调用listener#onMessage()。
四、SessionBean
1、SessionBean服务组件
SessionBean服务端有三大组件Home、EJbObject、SessionBean。
SessionBean是我们编写业务逻辑的地方。譬如数据库操作,进行计算等等。但是它对于客户端是不可见的,一个SessionBean实例的创建、销毁、激活、钝化等都是由EJB容器来管理的。
EJBObject:你可以将EJBObject看作是SessionBean对象的Proxy。需要将你的业务方法同样在EJBObject中复制一份。例如有一个HelloSessionBean#sayHello(str) 业务,如果要将该业务方法暴露出去给Client使用,与之对应的HelloEJBObject中必然得包含#sayHello(str)方法。也就是说Client需要使用EJBObject来达到与SessionBean交互的。
Home:这个名字起的怪异,我们可以将其理解为一个SessionBean的Factory。EJB容器通过Home对象来创建SessionBean对象,并装配出它的代理对象(EJBObject对象)。这是它的唯一用途。
2、Remote与Local
对于Home,和EJBObject,它们俩个都分为两类:Remote,Local。
Remote模式的,主要用于不在同一个JVM进程里,而在同一个进程里使用时,只需要使用Local模式的即可,这样选择自然是为了性能考虑。
3、Client访问处理流程(很容易看出Local性能好在哪里)
3.1 Remote模式下SessionBean 的访问流程
1、客户端通过JNDI获取到Home对象(EJBHome)的引用
2、客户端使用homeRef#create()方法来创建出EJBObject的Stub。
2.1)客户端底层使用Socket通信将次过程发给服务端Skeleton。
2.2)Skeleton调用服务端的Home对象的create方法,分配SessionBean对象(可能是新创建一个,也可能是从对象池中取一个,具体怎样依赖于是否是Stateful的),同时为该SessionBean对象生成一个代理对象(EJBObject实例),然后返回代理对象的引用。
2.3)客户端拿到EJBObject的引用就是Stub对象。
3、客户端访问业务
3.1) 客户端底层使用Socket通信将次过程发给服务端Skeleton。
3.2)Skeleton根据请求找到该EJBObject,调用与之关联的SessionBean的相应的业务。返回结果
3.3)客户端得到调用结果
3.2 Local模型下SessionBean的访问流程
1、客户端通过JNDI获取到Home对象(EJBLocalHome)的引用
2、客户端使用homeRef#create()方法来创建出EJBLocalObject(怎么创建也要依赖于是否的Stateful的)
3、客户端访问业务
五、常用注解
@Stateless:标记类把Java类声明为一个无状态会话bean
@EJB:表示注入实例,EJB注入和Resource注入相比,EJB注入只是针对于EJB而言,而Resource注入即是对所有的文件都可以进行注入。
@Remove:为会话 Bean 声明远程业务接口。用在接口上时,将该接口指定为远程业务接口。在这种情况下,不提供任何 value()。用在方法上,通过这个注解来说明在调用这个方法之后bean的实例将被清除掉。
@Local:用在 Bean 类上时,为会话 Bean 声明本地业务接口。用在接口上时,将该接口指定为本地业务接口。在这种情况下,不提供任何 value()。如:@Local(LawsuitService.class)
@Stateful:有状态会话 Bean 的组件定义注释。
@Timeout:指定无状态会话 Bean 类或消息驱动 Bean 类上接收该 Bean 的 EJB 计时器过期的方法。
@TransactionAttribute:在 TYPE-level 应用时,为会话或消息驱动 Bean 的所有业务方法指定默认事务属性。在方法级应用时,仅为该方法指定事务属性。
如:@TransactionAttribute(TransactionAttributeType.SUPPORTS)、
@TransactionAttribute(TransactionAttributeType.REQUIRED)。
@Interceptors:声明类或方法的拦截器的有序列表。
@Lock:方法声明一个并发锁的单例bean具有容器管理的并发。
@Schedule(排程器):计划时间为自动建立一个超时计划基于一个时间表达式。
@Startup:标记一个单例在应用初始化期间。
@ConcurrencyManagement:声明单例或有状态bean的并发管理类型
六、EJB的使用
1.依赖导入:
pom.xml
<dependencies> <dependency><groupId>javax</groupId><artifactId>javaee-web-api</artifactId><version>7.0</version><scope>provided</scope></dependency></dependencies>
2.代码示例:
@Stateless
//不写默认本地@Localpublic class ProdMgr {@EJB//注入prodService,如果出现多个ProdService接口的实现类可以使用name属性区分private ProdService service;public String getName() {String name = service.prod.getName();return name;}
EJB框架 详细介绍和注解的使用相关推荐
- rocketmq框架详细介绍
文章目录 消息队列 应用场景 rocketmq 为什么选择RocketMQ消息队列 RocketMQ所拥有的功能 rocketmq应用场景 应用解耦 流量削峰 数据分发 异步处理 日志处理 顺序消息 ...
- Mybatis框架详细介绍
一.Mybatis概述 1. 框架简介 目标 了解什么是框架 理解框架解决的问题 讲解 1.1 什么是框架 框架是整个或部分应用的可重用设计,是可定制化的应用骨架.它可以帮开发人员简化开发过程,提高开 ...
- Django框架详细介绍---cookie、session、自定义分页
1.cookie 在HTTP协议介绍中提到,该协议是无状态的,也就是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的 ...
- Amaple.js框架详细介绍
Amaple · 体验优先的JavaScript单页框架 Amaple (点此查看Github仓库)是专为单页web应用而设计的基于页面模块化的JavaScript框架,它可使开发者快速开发单页web ...
- java的annotation_Java Annotation认知(包括框架图、详细介绍、示例说明)
摘要 Java Annotation是JDK5.0引入的一种注释机制. 网上很多关于Java Annotation的文章,看得人眼花缭乱.Java Annotation本来很简单的,结果说的人没说清楚 ...
- Java Annotation认知(包括框架图、详细介绍、示例说明)
摘要 Java Annotation是JDK5.0引入的一种注释机制. 网上很多关于Java Annotation的文章,看得人眼花缭乱.Java Annotation本来很简单的,结果说的人没说清楚 ...
- Spring常用注解的详细介绍(包你学明白)
目录 1. 为什么要使用注解? 2. 什么是注解? 3. 在Spring中使用注解的前期准备 4. @Component注解的详细介绍 5. @Value注解的详解介绍 6. @Autowired ...
- 通过爬取美剧天堂详细介绍Scrapy 框架入门
通过爬取美剧天堂并详细介绍Scrapy 框架 前言(了解) 全文写了很多注释在标题处,时间充裕的可以详细看,需要找主要知识点的我已经标注明白了,直接翻到具体位置就行. Scrapy是用纯Python实 ...
- 全网详细介绍百度低代码框架amis及实例讲解
文章目录 1. 文章引言 2. amis官网 3. amis介绍 3.1 amis的简述 3.2 amis的初衷 3.3 amis的其他亮点 3.4 amis不适之处 4. amis使用 4.1 am ...
最新文章
- zabbix linux网卡流量,如何使用zabbix3.2监控Windows网卡流量
- docker-3-常用命令(上)
- 爬虫基于ADSL动态获取ip
- intellij运行flink的wordcount实验-Java版本
- linux 内核协助的探测
- 用maven profile实现环境配置切换
- [Ext JS 4] 实战之Chart, Column Chart 定制颜色
- Javascript ES6 Promise同步读取文件(使用async、await)
- pattern recognition letter 投稿时word 模板的说明乱码
- python识别验证码登陆学校网站
- freeCodeCamp 221题
- Leetcode之整数反转
- (转)来自瑞士的七个葫芦娃:各怀绝技的Wealthtech解决方案商
- 可视化任务编排拖拉拽的数据集成工具
- 红烧鸡翅(简单又好吃)
- 在Windows系统上部署DHCP服务器
- DB数据库密码怎么破啊~~~求高手帮忙解决下~
- 数据分析统计学原理第十二章:多个比例的比较、独立性及拟合优度检验 | 我的统计学原理复习日记
- 使用apktool解包和打包apk
- 构建风控评分卡模型介绍(WOE/KS/ROC)
热门文章
- 了解Netsparker扫描器
- (五)以太坊——委托投票智能合约
- 完美型性格的优势和不足,完美型人格的职业发展
- python图形化界面开发工具,python如何做图形化界面
- 不管怎样,苹果公司仍然是全球最有价值的公司
- Newtonsoft.Json Sample文档
- Gradle 的Dependencies
- 2023编程必会的100个代码大全,建议立刻收藏
- 易语言报错:无法定位链接器!请检查 tools\link.ini 中的配置是否正确。 静态连接失败...
- lazyLoadingEnabled和aggressiveLazyLoading作用