📅  最后修改于: 2023-12-03 15:30:36.193000             🧑  作者: Mango
EJB(Enterprise JavaBeans)是 Java EE 平台的一部分,用于开发分布式业务应用程序。它们是基于 Java 的可重用组件,可在不同的应用服务器上执行,在互联网和企业环境中用于构建大型、复杂、分布式系统。
依赖注入(Dependency Injection,DI)是一种设计模式,在该模式下,对象之间的依赖关系由容器在运行时通过反射动态注入。这比传统的编码方式更灵活。
EJB 是 Java EE 平台的一部分,它是一种可重用和可交互的 Java 组件,用于开发企业级应用程序。在 EJB 中,我们可以使用注释来声明依赖关系并实现依赖注入。
在 EJB 中,我们可以使用 @EJB
注释来声明依赖关系。它在 EJB3.0 中引入,用于注入其他 EJB 组件中的引用。可以将它应用于类级别和字段级别。
下面是一个将 MyService
注入到 MyServlet
中的示例:
@WebServlet(name = "MyServlet")
public class MyServlet extends HttpServlet {
@EJB
private MyService myService;
// ...
}
在运行时,Java EE 容器实例化 EJB 组件并解析其依赖关系。容器会查找与 @EJB
注释匹配的 EJB 组件,并将它们注入到声明了相应依赖项的字段中。
容器还负责管理 EJB 组件的生命周期,并提供事务和安全性支持。
在 EJB 的生命周期中,容器管理 EJB 组件的创建、激活、钝化和删除。在 EJB 组件上加上 @Stateless
、@Stateful
和 @Singleton
注释,可以指定 EJB 组件的生命周期。
@Stateless
:无状态组件,适用于容易扩展、并且可以在不同会话之间共享的任务。@Stateful
:有状态组件,适用于需要在多次调用之间保留状态的任务。@Singleton
:单例组件,适用于需要在整个应用程序中共享状态的任务。EJB 组件中的所有方法默认处于事务上下文中,即所有方法都在事务中运行。可以通过 @TransactionAttribute
注释更改方法的事务属性。
@Stateless
public class MyService {
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void doSomething() {
// ...
}
}
在示例中,doSomething
方法使用 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
注释,表示该方法将在新事务上下文中运行。
EJB 组件支持基于角色的安全,可以通过 @RolesAllowed
和 @PermitAll
等注释来控制对组件的访问。
@Stateless
@RolesAllowed({"admin"})
public class MyService {
@PermitAll
public void doSomething() {
// ...
}
}
在示例中,MyService
组件需要具有 admin
角色才能访问,但 doSomething
方法不需要任何权限即可访问。
EJB 是 Java EE 平台的一部分,用于构建大型、复杂、分布式企业应用程序。EJB 组件之间的依赖关系可以通过 @EJB
注释进行声明,并且容器会在运行时解析它们。EJB 组件的生命周期、事务和安全等问题也由容器管理。