spring中的bean默认是单例模式

本文详细介绍了Spring框架中的两种作用域模式:单例(singleton)与多例(prototype)。通过具体示例对比了这两种模式下bean实例的创建过程及特点,包括饿汉模式与懒汉模式的区别。

一、单例模式:在spring中其实是scope(作用范围)参数的缺省设定值
每个bean定义只生成一个对象实例,每次getBean请求获得的都是此实例
单例模式分为饿汉模式和懒汉模式,

饿汉模式
spring singleton的缺省是饿汉模式:启动容器时(即实例化容器时),为所有spring配置文件中定义的bean都生成一个实例
懒汉模式
在第一个请求时才生成一个实例,以后的请求都调用这个实例
spring singleton设置为懒汉模式:
<beans
default-lazy-init="true">

二、另一种和singleton对应的scope值---prototype多实例模式
调用getBean时,就new一个新实例
singleton和prototype的比较

singleton:
xml配置文件:
<bean id="dvdTypeDAO" class="com.terana.hibernate.impl.DvdTypeDAOImpl" />   
测试代码:
        ctx = new ClassPathXmlApplicationContext("spring-hibernate-mysql.xml");
        DvdTypeDAO tDao1 = (DvdTypeDAO)ctx.getBean("dvdTypeDAO");
        DvdTypeDAO tDao2 = (DvdTypeDAO)ctx.getBean("dvdTypeDAO");
运行:        
true
com.terana.hibernate.impl.DvdTypeDAOImpl@15b0333
com.terana.hibernate.impl.DvdTypeDAOImpl@15b0333

说明前后两次getBean()获得的是同一实例,说明spring缺省是单例

prototype:
<bean id="dvdTypeDAO" class="com.terana.hibernate.impl.DvdTypeDAOImpl" scope="prototype" />
执行同样的测试代码
运行:
false
com.terana.hibernate.impl.DvdTypeDAOImpl@afae4a
com.terana.hibernate.impl.DvdTypeDAOImpl@1db9852
说明scope="prototype"后,每次getBean()的都是不同的新实例

<think>好的,我现在需要回答用户关于Spring框架中Bean作用域的问题,特别是默认单例模式及其配置方式。首先,我要确认用户的问题核心:Spring Bean默认作用域是否是单例模式,以及如何配置。根据用户提供的引用内容,引用[4]明确指出Spring默认使用单例模式。因此,我需要先明确这一点,并引用相关文献支持。 接下来,用户可能想知道单例模式和原型模式的区别。根据引用[1]和[3],单例模式在整个Spring IoC容器中只有一个实,而原型模式每次获取都会生成新实。需要将这些区别清晰地列出,方便用户理解。 然后是关于配置方式的问题。引用[3]提到可以通过XML和注解两种方式配置。我需要分别说明这两种方法的具体步骤,如在XML中使用`scope`属性,或者在Java配置类中使用`@Scope`注解。同时,要注意默认情况下如果不指定`scope`,Bean就是的,这点需要强调。 另外,用户可能对单例模式的应用场景和潜在问题感兴趣。如,单例模式适合无状态Bean,而原型模式适合有状态的场景。需要提到线程安全和资源管理的问题,帮助用户正确选择作用域。 还要考虑是否需要比较其他作用域,如request、session等,但根据用户的问题,可能只需要聚焦在和原型上。不过可以简要提及其他作用域的存在,如引用[4]中提到的五种作用域,但不需要深入。 最后,生成的相关问题需要覆盖用户可能进一步询问的方向,比如配置方法、选择依据、线程安全问题以及单例模式的优缺点。确保问题有针对性,帮助用户深化理解。 现在需要检查是否有遗漏的信息,并确保引用正确。如,引用[2]提到了Spring源码实现,但用户的问题主要是配置和使用,可能不需要深入源码,但可以提到参考实现细节的文献。同时,保持回答结构清晰,分点说明,使用示代码块展示配置方式,符合用户要求的格式。</think>### Spring Bean默认作用域及单例模式配置方式 #### 一、默认作用域:单例模式 Spring框架中,**Bean默认作用域为单例模式**(Singleton)。这意味着在整个Spring IoC容器中,每个Bean定义仅创建一个实,所有对该Bean的请求都返回同一个对象[^4]。如: ```xml <!-- XML配置示默认scope为singleton --> <bean id="userService" class="com.example.UserService"/> ``` 或通过注解方式: ```java @Component public class UserService { /* ... */ } ``` #### 二、单例模式与原型模式的区别 | 特性 | 单例模式(Singleton) | 原型模式(Prototype) | |--------------|---------------------------------------|-------------------------------------| | 实数量 | 一个容器中仅一个实 | 每次请求生成新实 | | 生命周期 | 随容器创建/销毁 | 每次请求独立管理 | | 适用场景 | 无状态服务(如工具类、配置类) | 有状态对象(如用户会话、请求处理) | | 线程安全 | 需自行保证(若共享资源) | 天然隔离(实独立) | #### 三、配置方式 1. **单例模式默认无需显式配置)** - **XML配置**: ```xml <bean id="dataSource" class="com.example.DataSource" scope="singleton"/> ``` - **注解配置**: ```java @Component @Scope("singleton") // 可省略 public class DataSource { /* ... */ } ``` 2. **原型模式** - **XML配置**: ```xml <bean id="requestHandler" class="com.example.RequestHandler" scope="prototype"/> ``` - **注解配置**: ```java @Component @Scope("prototype") public class RequestHandler { /* ... */ } ``` #### 四、单例模式的注意事项 - **线程安全**:若Bean包含共享变量,需通过同步机制(如`synchronized`)或使用线程局部变量(`ThreadLocal`)保证线程安全。 - **资源占用**:Bean在容器生命周期内常驻内存,适合轻量级对象,避免用于大资源持有者。 #### 五、其他作用域(简要扩展) 除了和原型,Spring还支持: - **Request**:每个HTTP请求生成一个实(需Web环境)[^4]。 - **Session**:同一HTTP会话共享一个实。 - **Global Session**:用于Portlet应用(已逐渐淘汰)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值