一、作用域是什么?
下面用一个例子来解释Bean的作用域:你和别人一起协同开发的代码中有个Bean不想别人改动,那就可以通过调整Bean的作用域来解决.
下面有两个用户张三和李四,张三呢 调用了公共对象,但是张三特意使用了 user2来接收,
此时李四也想使用这个对象;然后他们一起调用了,但是发现李四调用的时候这个Name也被修改成小猫了.这是为什么呢 张三明显创建了一个新对象
其实真实的情况是Spring的IoC容器有两种作用域模式,一种是IoC默认的singleton(单例作用域),一种是可手动修改的prototype(原型作用域 / 多例作用域),在默认情况下,IoC容器采用singleton,也就是所有人获取到的都是同一个Bean对象,这样效率会高很多.
所以当我们使用原型模式时这个问题就解决了
//张三
@Controller
public class UserController2 {
@Autowired
private User user;
public void doMethod() {
User user2 = user;
System.out.println("UserController2 修改之前:User -> " + user);
user2.setName("小猫");
System.out.println("UserController2 修改之后:User -> " + user);
}
}
//李四
@Controller
public class UserController3 {
@Autowired
private User user;
public void doMethod() {
System.out.println("UserController3:user -> " + user);
}
}
1、singleton(单例作用域)
2、prototype(原型作用域)
3、request(请求作用域)
4、session(回话作用域)
5、application(全局作用域)
6、websocket( HTTP WebSocket 作用域)
二、单例作⽤域VS 全局作⽤域
- singleton 是 Spring Core 的作⽤域;application 是 Spring Web 中的作⽤域;
- singleton 作⽤于 IoC 的容器,⽽ application 作⽤于 Servlet 容器。
三、设置作用域
singleton
作用域是Spring
中默认的作用域,
使⽤ @Scope 标签就可以⽤来声明 Bean 的作⽤域,⽐如设置 Bean 的作⽤域,如下代码所示:
@Component
public class Users {
@Scope(prototype)
@Bean(name = "u")
public User user() {
User user = new User();
user.setId(1);
user.setName("Hi user");
return user;
}
}
@Scope 标签既可以修饰⽅法也可以修饰类,@Scope 有两种设置⽅式: