Bean的作用域
在Spring中,默认情况下创建的bean都是单实例对象,当然也可以通过实际的需求进行修改。我们可以将这种操作视为设置bean的作用域。实现的方式有配置文件和注解两种形式,然而不论是哪种方式它们都对应了四种作用域。
这四种作用域分别为:
singleton(默认值):表示创建的对象是单实例的。
prototype:表示创建的对象是多实例的。
request:表示一次请求生成一个实例。
session:表示一次会话生成一个实例。
注:在这四种作用域中,singleton和prototype比较常用,进而演示的时候也是以这两种为主。
代码演示
编写用于演示的两个java类
public class User {
}
public class Car {
}
通过xml形式设置bean的作用域
1、编写配置文件。
通过设置bean标签的scope属性来设置bean的作用域。
<!-- 注入User类,设置bean为单实例。scope="singleton"可以省略不写,因为spring默认创建的bean就是单实例的 -->
<bean id="user" class="com.springtest.bean.User" scope="singleton"/>
<!-- 注Car类,设置bean为多实例 -->
<bean id="car" class="com.springtest.bean.Car" scope="prototype"/>
2、编写测试类进行验证。
@Test
public void test1() {
// 创建Spring的IOC容器
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
// User设置的是单实例,Car设置的多实例。通过比较地址进行验证。
Object user1 = context.getBean("user");
Object user2 = context.getBean("user");
if(user1 == user2) {
System.out.println("通过Spring创建的User是单实例对象!");
} else {
System.out.println("通过Spring创建的User是多实例对象!");
}
Object car1 = context.getBean("car");
Object car2 = context.getBean("car");
if(car1 == car2) {
System.out.println("通过Spring创建的Car是单实例对象!");
} else {
System.out.println("通过Spring创建的Car是多实例对象!");
}
}
3、验证结果。
通过注解形式设置bean的作用域
使用@scope注解可以设置bean的作用域。该注解可作用在类和方法上。通过设置注解value属性的值来设置bean的作用域。value属性的取值范围和通过xml形式设置时一样。
1、编写配置类,并通过@Bean注解注bean。
@Configuration
public class BeanScopeConfig {
@Bean
@Scope(value = "prototype") // 设置User为多实例
public User user() {
return new User();
}
@Bean
@Scope(value = "singleton") // 设置Car为单实例
public Car car() {
return new Car();
}
}
2、编写测试类进行验证。
@Test
public void test2() {
// 创建Spring的IOC容器
ApplicationContext context = new AnnotationConfigApplicationContext(BeanScopeConfig.class);
// User设置的是多实例,Car设置的单实例。通过比较地址进行验证。
Object user1 = context.getBean("user");
Object user2 = context.getBean("user");
String userScope = user1 == user2 ? "User为单实例对象!" : "User为多实例对象!";
System.out.println(userScope);
Object car1 = context.getBean("car");
Object car2 = context.getBean("car");
String carScope = car1 == car2 ? "Car为单实例对象!" : "Car为多实例对象!";
System.out.println(carScope);
}
3、验证结果。
今天的分享就到这里了,如果感觉“菜鸟”写的文章还不错,记得点赞、转发加关注呦!你们的支持就是我坚持下去的动力。文章哪里写的有问题的也希望大家可以指出,我会虚心受教。