Spring入门之创建Bean的时间以及lazy-init属性

本文介绍了Spring框架中懒加载机制的工作原理及其配置方式。通过设置lazy-init属性,开发者可以选择在容器启动时立即初始化bean还是延迟到首次请求时再进行初始化。文章分析了这两种策略的优缺点,并探讨了它们对内存使用及错误检测的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.在默认情况下,在启动spring容器时,spring容器配置文件中的类就已经创建完成对象了。

2.可以在applicationContext.xml配置文件中<bean></bean>标签中配置属性lazy-init

3.默认情况下lazy-init为default。

4.lazy-init可以设置为true或false。当设置为true时,在context.getBean()时才创建对象;当设置为false时,在启动spring容器时就创建对象。

5.设置为true时
优点:如果该bean中有大数据存在,则什么时候context.getBean(0时创建对象,可以防止数据过早存在内存中做到了懒加载;
缺点:如果在spring配置文件中,该bean的配置有误,那么在服务器启动时发现不了。

6.设置为false时
优点:如果在在spring配置文件中,该bean的配置有误,那么在服务器启动时会发现该bean有错误;
缺点:如果存在大量的数据,会过早的停留在内存中,浪费内存。

### Spring框架中Bean作用域(Scope)的默认值 在Spring框架中,Bean的作用域(Scope)用于定义 Bean 的生命周期及其可见范围。若未显式指定 `@Scope` 注解或 XML 配置中的 `scope` 属性,则 Spring 会使用 `"singleton"` 作为默认作用域[^2]。 这意味着,在大多数情况下,Spring 容器将只为该 Bean 创建一个共享的实例,并在整个应用上下文中提供对该实例的引用。此行为适用于通过注解(如 `@Component`、`@Service`)或 XML 配置定义的 Bean,只要未明确设置其他作用域,都会以单例模式进行管理[^1]。 例如,以下 Java 注解配置中并未指定 `@Scope`: ```java @Component public class MyService { // 默认作用域为 singleton } ``` 在此示例中,`MyService` 将被 Spring 容器作为单例 Bean 管理,所有对该 Bean 的请求都将返回相同的实例[^2]。 同样地,在 XML 配置文件中省略 `scope` 属性时,默认也为 `singleton`: ```xml <bean id="myBean" class="com.example.MyBean"/> <!-- 等价于 scope="singleton" --> ``` 这种设计适用于无状态组件或需要全局共享的状态对象,是 Spring 中最常用的作用域之一[^4]。 --- ### 单例作用域的特点 - **唯一实例**:每个 Spring 应用上下文中仅存在一个该 Bean 的实例。 - **容器管理生命周期**:Bean创建和销毁由 Spring 容器控制,通常与上下文的启动和关闭同步。 - **资源共享**:适合存储全局状态或共享资源,如数据库连接池、缓存服务等。 --- ### 其他常见作用域简介 虽然 `singleton` 是默认作用域,Spring 还支持多种其他作用域,包括: - `prototype`:每次请求都会创建一个新的实例。 - `request`:每个 HTTP 请求拥有独立的 Bean 实例(仅限 Web 应用)。 - `session`:每个 HTTP Session 拥有一个独立的 Bean 实例(仅限 Web 应用)。 - `application`:每个 ServletContext 生命周期内只有一个实例(仅限 Web 应用)。 - `websocket`:每个 WebSocket 会话周期内只有一个实例(仅限 WebSocket 应用)。 这些作用域可以通过 `@Scope("prototype")` 或在 XML 配置中指定 `scope` 属性来启用[^3]。 --- ### 自定义作用域的注册方式 Spring 提供了扩展机制,允许开发者自定义作用域并通过 `ConfigurableBeanFactory#registerScope` 方法将其注册到容器中。例如: ```java ConfigurableBeanFactory beanFactory = ...; beanFactory.registerScope("customScope", new CustomScope()); ``` 该方法可用于实现特定业务场景下的作用域管理,如线程级作用域、任务作用域等。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值