SSM的学习(四)—Bean的作用域及id和name的区别
Bean的作用域
作用域限定了Spring Bean的作用范围,在Spring配置文件定义Bean时,通过声明scope配置项,可以灵活定义Bean的作用范围。当你希望每次IOC容器返回的Bean是同一个实例时,可以设置scope为singleton;当你希望IOC容器返回的Bean实例是一个新的实例时,可以设置scope为prototype。
scope配置项有5个属性,用于不同的作用域。
singleton
使用该属性定义Bean时,IOC容器仅创建一个Bean实例,IOC容器每次返回的是同一个Bean实例。
singleton是默认的作用域,当定义Bean时,如果没有指定scope配置项,Bean的作用域被默认为singleton。
singleton属于单例模式,在整个系统上下文环境中,仅有一个Bean实例。
也就是说,在整个系统上下文环境中,你通过Spring IOC获取的都是同一个实例。
prototype
使用该属性定义Bean时,IOC容器可以创建多个Bean实例,每次返回的都是一个新的实例。
当一个Bean的作用域被定义prototype时,意味着程序每次从IOC容器获取的Bean都是一个新的实例。
因此,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。
request
该属性仅对HTTP请求产生作用,使用该属性定义Bean时,每次HTTP请求都会创建一个新的Bean,适用于WebApplicationContext环境。
session
该属性仅用于HTTP Session,同一个Session共享一个Bean实例。不同Session使用不同的实例。
global-session
该属性仅用于HTTP Session,同session作用域不同的是,所有的Session共享一个Bean实例。
最为常见的是singleton(单例模式)和prototype(多例模式)下面记录一下实现的两种方式:
第一种xml配置:
<bean class="com.yangyang.bean" id="user" scope="prototype">
当不配置scope或scope的值为singleton时默认为单例模式
第二种java配置:
@Configuration
public class PersonnelConfig {
@Bean
@Scope("prototype")
public Personnel PersonnelBoss(){
Personnel ds = new Personnel();
ds.setUrl("dev:8080");
ds.setUserName("人事部Boss");
ds.setPassword("1234");
return ds;
}
id和name的区别
在xml配置中,既可以通过id或name给bean指定一个唯一标识符,大部分情况下是没有区别的,有一个小区别需要注意:
name支持多个值同时标注但id不支持即使用逗号隔开但标识不变。例如
<bean class="com.yangyang.bean" name=“user1,user2,user3” scope="prototype">
此时通过user1,user2,user3都可以获取到该bean
<bean class="com.yangyang.bean" id="user1,user2,user3" scope="prototype">
此时只能通过(user1,user2,user3)来获取该bean
混合配置
在实际开发中,许多的开发人员的习惯不同,导致有的喜欢用xml有的喜欢注解。但如果想要混合开发需要如下注释:
@Configuration
@ImportResource("classpath:applicationContext.xml")
public class User(){
}