Spring Boot非单例Bean

在Spring Boot框架中,Bean是一个管理和组织应用程序中的对象的机制。默认情况下,Spring Boot创建的Bean都是单例的,即在整个应用程序中只有一个实例。然而,在某些情况下,我们可能需要创建非单例的Bean,即在每次请求时都创建一个新的实例。本文将介绍如何在Spring Boot中创建非单例Bean,并提供相应的代码示例。

什么是非单例Bean?

在Spring Boot中,单例Bean是在容器初始化时创建的,并在整个应用程序中共享。这意味着每次通过依赖注入获取该Bean时,都会得到同一个实例。

相反,非单例Bean是在每次请求时动态创建的。这意味着每次通过依赖注入获取该Bean时,都会得到一个新的实例。非单例Bean的创建和销毁由Spring容器自动管理。

如何创建非单例Bean?

要创建非单例Bean,我们需要在Bean的定义中添加@Scope注解,并将其值设置为prototype

下面是一个示例,演示如何创建一个非单例Bean:

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
@Scope("prototype")
public class MyNonSingletonBean {
    // Bean的逻辑代码
}

在上面的代码中,我们使用@Scope注解将MyNonSingletonBean标记为非单例Bean。这样,在每次通过依赖注入获取MyNonSingletonBean时,都会得到一个新的实例。

示例应用

为了更好地理解非单例Bean的概念,我们可以创建一个简单的示例应用。假设我们正在开发一个在线商店应用程序,我们需要为每个用户创建一个购物车对象。

首先,我们需要创建一个ShoppingCart类来表示购物车:

@Component
@Scope("prototype")
public class ShoppingCart {
    private List<String> items = new ArrayList<>();

    public void addItem(String item) {
        items.add(item);
    }

    public List<String> getItems() {
        return items;
    }
}

在上面的代码中,ShoppingCart类被标记为非单例Bean,并包含了一些基本的购物车操作,如添加商品和获取商品列表。

接下来,我们需要创建一个UserController类来处理用户请求,并使用ShoppingCart对象来管理购物车:

@RestController
public class UserController {
    private final ShoppingCart shoppingCart;

    public UserController(ShoppingCart shoppingCart) {
        this.shoppingCart = shoppingCart;
    }

    @PostMapping("/user/{userId}/cart")
    public void addItemToCart(@PathVariable String userId, @RequestBody String item) {
        shoppingCart.addItem(item);
    }

    @GetMapping("/user/{userId}/cart")
    public List<String> getCartItems(@PathVariable String userId) {
        return shoppingCart.getItems();
    }
}

在上面的代码中,UserController类使用ShoppingCart对象来添加商品和获取商品列表。由于ShoppingCart是非单例Bean,所以每个用户都会有自己的购物车实例。

类图

下面是 ShoppingCartUserController 类的类图:

classDiagram
    class ShoppingCart {
        -List<String> items
        +addItem(item: String): void
        +getItems(): List<String>
    }

    class UserController {
        -ShoppingCart shoppingCart
        +addItemToCart(userId: String, item: String): void
        +getCartItems(userId: String): List<String>
    }

    ShoppingCart "1" --> "1" UserController

上述类图描述了 ShoppingCart 类和 UserController 类之间的关系,一个 UserController 实例与一个 ShoppingCart 实例关联。

总结

本文介绍了在Spring Boot中创建非单例Bean的方法,并提供了相应的代码示例。非单例Bean与单例Bean相比,每次通过依赖注入获取时都会创建一个新的实例,适用于需要动态创建的场景。通过使用@Scope("prototype")注解,我们可以轻松地在Spring Boot应用程序中创建非单例Bean,并实现相应的业务逻辑。希望本文能帮助您更好地理解和应用非单例Bean的概念。