Spring 中 bean 的作用域有哪些?

3 个回答

  • 凌影
    优先考虑那些先考虑你的人
    ### Spring 支持的几种 Bean 的作用域 Spring 容器中的 Bean 可以分为以下 5 个作用域: 1. **singleton** - **描述**:默认作用域,每个容器中只有一个 Bean 的实例。 - **特性**:单例模式由 `BeanFactory` 自身来维护,整个 Spring 容器共享一个实例。 - **应用场景**:适用于无状态的 Bean,通常用于共享资源和配置。 2. **prototype** - **描述**:为每一个 Bean 请求提供一个新的实例。 - **特性**:每次请求 Bean 时,都会创建一个新的实例,实例的生命周期由请求方管理。 - **应用场景**:适用于有状态的 Bean 或者需要独立实例的 Bean。 3. **request** - **描述**:为每一个 HTTP 请求创建一个新的实例。 - **特性**:在请求完成以后,Bean 会失效并被垃圾回收器回收。 - **应用场景**:适用于 Web 应用程序,每个请求需要一个独立的 Bean 实例。 4. **session** - **描述**:确保每个 HTTP 会话中有一个 Bean 的实例。 - **特性**:在会话过期后,Bean 会随之失效。 - **应用场景**:适用于 Web 应用程序,每个会话需要一个独立的 Bean 实例。 5. **global-session** - **描述**:全局作用域,通常与 Portlet 应用相关。 - **特性**:在 Portlet 容器中,全局作用域类似于 Servlet 中的 session 作用域,但适用于所有 portlet 共享的全局变量。 - **应用场景**:适用于 Portlet 应用程序,需要在所有 portlet 中共享变量的场景。 重新整理后,Spring 支持的几种 Bean 的作用域总结如下: 1. **singleton**:整个 Spring 容器共享一个实例,默认作用域,适用于无状态的共享资源。 2. **prototype**:每次请求都会创建一个新的实例,适用于有状态或独立实例的 Bean。 3. **request**:为每个 HTTP 请求创建一个新的实例,请求完成后失效,适用于 Web 应用。 4. **session**:为每个 HTTP 会话创建一个新的实例,会话过期后失效,适用于 Web 应用。 5. **global-session**:全局作用域,适用于 Portlet 应用中的共享全局变量,类似于 Servlet 中的 session 作用域。
    发布于 2024-04-12 22:20 •IP属地 甘肃
    举报
    评论
    收藏

  • 秦月
    谎言不会伤人,真相才是快刀。
    ### Spring 基于 XML 注入 Bean 的几种方式 在 Spring 中,可以通过多种方式基于 XML 配置文件注入 Bean。以下是常用的几种方式: 1. **Setter 方法注入** - **描述**:通过调用 Bean 的 setter 方法进行属性注入。 - **示例**: ```xml <bean id="myBean" class="com.example.MyBean"> <property name="property1" value="value1"/> <property name="property2" ref="anotherBean"/> </bean> ``` 2. **构造器注入** - **描述**:通过调用 Bean 的构造函数进行属性注入。 - **方式**: 1. **通过 `index` 设置参数的位置**: ```xml <bean id="myBean" class="com.example.MyBean"> <constructor-arg index="0" value="value1"/> <constructor-arg index="1" ref="anotherBean"/> </bean> ``` 2. **通过 `type` 设置参数类型**: ```xml <bean id="myBean" class="com.example.MyBean"> <constructor-arg type="java.lang.String" value="value1"/> <constructor-arg type="com.example.AnotherBean" ref="anotherBean"/> </bean> ``` ### 其他方式(可选) 尽管在面试中一般回答前面两种方式即可,下面是其他较少使用但仍可用于 XML 注入的方式: 3. **静态工厂方法注入** - **描述**:通过调用静态工厂方法创建 Bean 实例。 - **示例**: ```xml <bean id="myBean" class="com.example.MyBeanFactory" factory-method="createInstance"> <property name="property1" value="value1"/> </bean> ``` 4. **实例工厂方法注入** - **描述**:通过调用实例工厂方法创建 Bean 实例。 - **示例**: ```xml <bean id="myFactory" class="com.example.MyFactory"/> <bean id="myBean" factory-bean="myFactory" factory-method="createInstance"> <property name="property1" value="value1"/> </bean> ``` ### 总结 在面试中,通常只需回答前两种常用的注入方式即可: 1. **Setter 方法注入**:通过调用 Bean 的 setter 方法进行属性注入。 2. **构造器注入**:通过调用 Bean 的构造函数进行属性注入,可通过 `index` 或 `type` 设置参数。 其他方式(静态工厂注入和实例工厂注入)较为少用,不必在面试中提及以避免深入提问时无法回答的尴尬。
    发布于 2021-10-21 00:20 •IP属地 天津
    举报
    评论
    收藏

  • 瓶子先生
    疑是仙女下凡来,回眸一笑胜星华。
    Spring 中 bean 的默认作用域就是 singleton(单例)的。 除了 singleton 作用域,Spring 中 bean 还有下面几种作用域: 1.prototype : 每次请求都会创建一个新的 bean 实例。 2. request : 每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP request内有效。 3. session : 每一次HTTP请求都会产生一个新的 bean,该bean仅在当前 HTTP session 内有效。 4. global-session: 全局session作用域,仅仅在基于portlet的web应用中才有意义,Spring5已经没有了。Portlet是能够生成语义代码(例如:HTML)片段的小型Java Web插件。它们基于portlet容器,可以像servlet一样处理HTTP请求。但是,与 servlet 不同,每个 portlet 都有不同的会话
    编辑于 2021-06-11 17:20 •IP属地 广东
    已采纳
    举报
    评论
    收藏