Spring Bean的作用域(作用范围)

本文介绍了Spring中如何通过注解和XML方式配置Bean的作用域,包括singleton和prototype两种。singleton作用域的Bean是单例的,每次获取都是同一个对象;而prototype作用域则是多例,每次请求都会创建新的实例。示例代码展示了不同配置下获取Bean的结果,强调了默认作用域为singleton以及如何切换到prototype。
摘要由CSDN通过智能技术生成

文章目录

scope
1. 注解方式配置
    1.1 测试singleton
    1.2 测试prototype
2. XML方式配置

在Spring中使用 scope来表示一个bean定义对应产生实例的类型,也可以说是对应实例的作用范围。Spring中 指定scope的方法分以下两种:

采用XML配置方式时,可以用<bean />标签中的scope属性可以指定bean的作用范围。
采用注解方式时,可以用@Scope(value = "singleton")来指定

scope

scope有如下五个取值:

singleton:单例的(默认的),使用singleton定义的Bean是单例的,每次调用getBean都是调用的同一个对象。只要IoC容器一创建就会创建Bean的实例。
prototype:多例的,每次通过Spring IoC容器获取prototype定义的Bean时,容器都将创建一个新的Bean实例。创建时不会实例该Bean,只有调用getBean方法时,才会实例化。
request:作用于web的请求范围,在每一次HTTP请求时,容器会返回Bean的同一个实例,对不同的HTTP请求则会产生一个新的Bean,而且该Bean仅在当前HTTP Request内有效。
session:作用于web的会话范围,在一次HTTP Session中,容器会返回该Bean的同一个实例,对不同的HTTP请求则会产生一个新的Bean,而且该Bean仅在当前HTTP Session内有效。
global-session:作用于集群环境的会话范围(全局会话范围),在一个全局的HTTP Session中,容器返回Bean的同一个实例。当不是集群环境时,它就是session。

配置方式如下有如下两种:

  1. 注解方式配置

注解方式配置时,只需在需要配置的bean上使用@Scope注解即可,如下:
1.1 测试singleton

@Component(value = “accountService”)//默认名称是accountServiceImpl
//@Scope(value = “singleton”) 此处默认是singleton
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountDao accountDao;
public void saveAccount() {
accountDao.saveAccount();
}
}

public static void main(String[] args) {
//1.获取核心容器对象
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(“bean.xml”);
//2.根据id获取Bean对象
AccountService accountService = (AccountService) applicationContext.getBean(“accountService”);
AccountService accountService2 = (AccountService) applicationContext.getBean(“accountService”);

//3.打印获取的对象
System.out.println(accountService);
System.out.println(accountService2);
System.out.println(accountService == accountService2);
}

运行结果:

com.xingze.service.impl.AccountServiceImpl@dbd940d
com.xingze.service.impl.AccountServiceImpl@dbd940d
true

1.2 测试prototype

代码中增加`@Scope(value = “prototype”),如下:

@Component(value = “accountService”)//默认名称是accountServiceImpl
@Scope(value = “prototype”)
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountDao accountDao;
public void saveAccount() {
accountDao.saveAccount();
}
}

运行结果:

com.xingze.service.impl.AccountServiceImpl@2df32bf7
com.xingze.service.impl.AccountServiceImpl@530612ba
false

分析:Spring Bean的默认作用范围scope是singleton的,而prototype是多例的。
2. XML方式配置

XML方式配置作用域只需在Spring配置文件中配置bean时加入scope属性即可。如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值