📜  EJB-依赖注入(1)

📅  最后修改于: 2023-12-03 15:30:36.193000             🧑  作者: Mango

EJB 依赖注入

什么是 EJB

EJB(Enterprise JavaBeans)是 Java EE 平台的一部分,用于开发分布式业务应用程序。它们是基于 Java 的可重用组件,可在不同的应用服务器上执行,在互联网和企业环境中用于构建大型、复杂、分布式系统。

什么是依赖注入

依赖注入(Dependency Injection,DI)是一种设计模式,在该模式下,对象之间的依赖关系由容器在运行时通过反射动态注入。这比传统的编码方式更灵活。

EJB 中的依赖注入

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 组件的创建、激活、钝化和删除。在 EJB 组件上加上 @Stateless@Stateful@Singleton 注释,可以指定 EJB 组件的生命周期。

  • @Stateless:无状态组件,适用于容易扩展、并且可以在不同会话之间共享的任务。
  • @Stateful:有状态组件,适用于需要在多次调用之间保留状态的任务。
  • @Singleton:单例组件,适用于需要在整个应用程序中共享状态的任务。
EJB 事务管理

EJB 组件中的所有方法默认处于事务上下文中,即所有方法都在事务中运行。可以通过 @TransactionAttribute 注释更改方法的事务属性。

@Stateless
public class MyService {

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void doSomething() {
        // ...
    }
}

在示例中,doSomething 方法使用 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 注释,表示该方法将在新事务上下文中运行。

EJB 安全

EJB 组件支持基于角色的安全,可以通过 @RolesAllowed@PermitAll 等注释来控制对组件的访问。

@Stateless
@RolesAllowed({"admin"})
public class MyService {

    @PermitAll
    public void doSomething() {
        // ...
    }
}

在示例中,MyService 组件需要具有 admin 角色才能访问,但 doSomething 方法不需要任何权限即可访问。

总结

EJB 是 Java EE 平台的一部分,用于构建大型、复杂、分布式企业应用程序。EJB 组件之间的依赖关系可以通过 @EJB 注释进行声明,并且容器会在运行时解析它们。EJB 组件的生命周期、事务和安全等问题也由容器管理。