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

文章目录

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

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

采用XML配置方式时,可以用标签中的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属性即可。如下:

你可能感兴趣的:(spring系列,spring,bean)