SpringBoot 第七篇 之 Bean 的作用域

本文探讨了SpringBoot中Bean的作用域,主要集中在单例(singleton)和原型(prototype)两种基本作用域。Spring的IoC容器默认为单例模式,而通过@Scope注解可以设置为原型,实现每次请求时创建新的Bean实例。此外,还提到了在WebApplicationContext中可定义更多作用域,如请求(REQUEST)、会话(SESSION)和应用(APPLICATION)。

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

在IoC容器最顶级接口BeanFactory 中,有 isSingleton(单例), isPrototype (原型)

两个方法,isSingleton 方法如果返回true ,则bean在IoC容器中以单例存在,这是spring

IoC容器的默认值。

isPrototype 是true 则每次获取bean的时候会创建一个新的bean。

单例(singleton),原型(pototype)即 bean的两种作用域。

spring 共有以下几种作用域

Bean的作用域
作用域类型使用范围作用域描述
singleton所用spring应用默认值,IoC容器只存在单例
prototype所有spring应用每当从ioc容器中获取一个bean,则创建一个新的bean
sessionspring web 应用http 会话
application spring web 应用web工程生命周期
requestspring web 应用web 单次请求
globalSessionspring web 应用在一个全局的httpsession 中,一个bean对应一个实例。

 

 

 

 

 

 

 

 

 

测试作用域 :

package com.didispace.bean;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
//@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) 放开则是原型模式,每次返回新实例
public class DataBaseProperties {
    @Value("${database.driverName}")
    private String driverName;

    @Value("${database.url}")
    private String url;

    @Value("${database.userName}")
    private String userName;

    @Value("${database.password}")
    private String password;

    public String getDriverName() {
        return driverName;
    }

    public void setDriverName(String driverName) {
        System.out.println(driverName);
        this.driverName = driverName;
    }

    public String getUrl() {

        return url;
    }

    public void setUrl(String url) {
        System.out.println(driverName);
        this.url = url;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
package com.didispace.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;


//@Configuration 代表这时一个java配置文件,
// spring的 容器会根据它来生成IoC容器装配Bean
@Configuration
@ComponentScan(value = "com.didispace.*")
public class AppConfig {

}
package com.didispace;


import com.didispace.bean.DataBaseProperties;
import com.didispace.bean.User;
import com.didispace.config.AppConfig;
import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class IoCTest {
    private static Logger log = Logger.getLogger(IoCTest.class);

    public static void main (String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
        DataBaseProperties user = ctx.getBean(DataBaseProperties.class);
        DataBaseProperties user1 = ctx.getBean(DataBaseProperties.class);
        System.out.println(user1 == user);
        log.info(user.getUserName());
    }
}

代码 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)中

ConfigurableBeanFactory 只有两种类型 SCOPE_SINGLETON,  SCOPE_PROTOTYPE

如果想使用 spring web 容器的四种类型,需要使用 WebApplicationContext 去定义其他作用域

如:SCOPE_REQUEST (请求),会话 ( SCOPE_SESSION ) 和应用 ( SCOPE
APPLICATION ) 。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值