CDI 中的 @ApplicationScoped 和 @Singleton 作用域有什么区别

java

1个回答

写回答

Larry1017

2025-07-08 10:11

+ 关注

Java
Java

CDI(Contexts and Dependency Injection)是Java EE技术的一部分,它提供了一种依赖注入的方式来管理对象的生命周期和作用域。在CDI中,有两个常用的作用域注解,分别是@ApplicationScoped和@Singleton。虽然它们的作用域都是在整个应用程序中保持单例状态,但它们在实现和使用上有一些区别。

@ApplicationScoped注解是CDI中的一个作用域注解,用于标识一个Bean的生命周期和作用域为整个应用程序。它的实例会在应用程序启动时创建,并在整个应用程序的生命周期内保持不变。这意味着无论在应用程序中的哪个地方注入这个Bean,都会得到同一个实例。

@Singleton注解也是CDI中的一个作用域注解,用于标识一个Bean的生命周期和作用域为整个应用程序。与@ApplicationScoped不同的是,@Singleton注解的实现是基于EJB(Enterprise Java Beans)规范的。它的实例也会在应用程序启动时创建,并在整个应用程序的生命周期内保持不变。与@ApplicationScoped相比,@Singleton注解还提供了一些额外的特性,如并发控制和事务管理。

使用@ApplicationScoped的案例代码:

import Javax.enterprise.context.ApplicationScoped;

import Javax.inject.Named;

@Named

@ApplicationScoped

public class MyBean {

private int count;

public int getcount() {

return count;

}

public void incrementCount() {

count++;

}

}

使用@Singleton的案例代码:

import Javax.ejb.Singleton;

import Javax.ejb.Startup;

@Singleton

@Startup

public class MyBean {

private int count;

public int getcount() {

return count;

}

public void incrementCount() {

count++;

}

}

区别:

1. 实现方式:@ApplicationScoped是CDI的一部分,而@Singleton是基于EJB规范的。

2. 引入方式:@ApplicationScoped可以在任何CDI环境中使用,而@Singleton只能在支持EJB的环境中使用。

3. 额外特性:@Singleton注解提供了一些额外的特性,如并发控制和事务管理,而@ApplicationScoped没有提供这些特性。

4. 命名空间:@Singleton注解的实例是在整个应用程序中共享的,而@ApplicationScoped注解的实例是在整个应用程序中的命名空间中共享的。

:

虽然@ApplicationScoped和@Singleton都是用于标识一个Bean的生命周期和作用域为整个应用程序,但@Singleton注解是基于EJB规范的,提供了一些额外的特性,而@ApplicationScoped注解是CDI的一部分,没有这些额外特性。在选择使用哪个注解时,需要根据具体的需求和环境来决定。

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号