Spring 中 Bean 的作用域中的单例和多例

        在Spring框架中,Bean的作用域(Scope)定义了Bean实例的创建和共享方式。其中,单例(Singleton)和多例(Prototype)是两种最基本的作用域。

单例(Singleton)

        定义:在Spring容器中,单例Bean在整个容器的生命周期内只会存在一个共享的实例。无论有多少次请求该Bean,容器都会返回同一个实例。

        配置方式

        在XML配置文件中,可以通过设置标签的scope属性为singleton来指定Bean为单例作用域。例如:。在Java配置类中,可以使用@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)注解(但通常省略,因为单例是默认作用域)或直接在@Bean方法上不做特殊配置(因为单例是默认作用域)。

        特点

        1、节省内存:因为只创建一个实例,所以内存开销较小。

        2、线程安全:如果Bean是无状态的(即不保存任何请求或会话特有的数据),那么它是线程安全的。

        3、适用于无状态的服务层组件,如Service和DAO层对象。

多例(Prototype)

        定义:在Spring容器中,多例Bean每次被请求时都会创建一个新的实例。即每次通过getBean()方法或依赖注入请求该Bean时,都会返回一个新的实例。

        配置方式

        在XML配置文件中,可以通过设置标签的scope属性为prototype来指定Bean为多例作用域。例如:。在Java配置类中,可以使用@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)注解来指定Bean为多例作用域。

        特点

        每次请求都会创建新实例,所以内存开销较大。适用于有状态或需要保持独立数据的Bean,如Action层对象。开发者需要自行管理Bean的生命周期,包括初始化和销毁。

注意事项:

        1、单例Bean在容器启动时就会被实例化,并缓存起来。而多例Bean则是在每次请求时才会被实例化。

        2、对于单例Bean,如果其依赖了多例Bean,那么每次注入到单例Bean中的多例Bean实例都将是相同的(即在单例Bean初始化时注入的那个实例),除非使用代理或其他技术来实现每次注入时都获得新的多例Bean实例。

        3、在Web应用程序中,Spring还提供了其他作用域,如request(每次HTTP请求创建一个新的Bean实例)、session(每个HTTP会话创建一个新的Bean实例)和globalSession(在Portlet环境中,多个会话之间共享的Bean实例)。这些作用域主要用于Web应用程序中,以控制Bean实例的生命周期和可见性。

你可能感兴趣的:(spring,java,后端)