Bean 作用域
有七种作用域,分别为 singleton
、prototype
、request
、session
、globalSession
、application
、websocket
。
而singleton
与prototype
最为常用。
singleton 作用域
<bean id="userDao" ... scope="singleton"></bean>
singleton
是 Spring 容器默认的作用域,不必特意为 增加scope="singleton"
。
Bean 的作用域为singleton
时,Spring 容器里只会有一个 Bean 实例。而且创建 Spring 实例之后,创建 Bean 的工作,也会紧随其后。
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
// 👆 这里创建 Bean ,接着调用 UserDao 的初始化方法
UserDao userDao_1 = (UserDao) app.getBean("userDao");
UserDao userDao_2 = (UserDao) app.getBean("userDao");
// 👆 这里 userDao_1 和 userDao_2 的接收 Bean 实例
System.out.println(userDao_1);
System.out.println(userDao_2);
// 👆 如果这里直接输出他俩的地址,会发现,地址是一样的
// 如上所说,此类 Bean,Spring 容器内只会有一个实例
}
而prototype
与singleton
是一定区别的。
prototype 作用域
<bean id="userDao" ... scope="prototype"></bean>
scope="prototype"
需要特地写出来。
有些 Bean 得保持会话状态,这些 Bean 应使用prototype
作用域。
与singleton
不同,Spring 容器中,prototype
作用域的 Bean,可以有若干个。还有,这种 Bean 的创建,并不紧跟在创建 Spring 容器之后,而是在getBean
时创建,也好理解,毕竟这种 Bean 可以有好几个,一开始就创建好,很不合理。
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
// 👆 这里只是创建 Spring 容器
UserDao userDao_1 = (UserDao) app.getBean("userDao");
UserDao userDao_2 = (UserDao) app.getBean("userDao");
// 👆 这里创建 Bean 。接着调用 UserDao 的初始化方法
// 创建了两个 Bean 实例,那就会调用两次初始化方法
System.out.println(userDao_1);
System.out.println(userDao_2);
// 👆 如果这里直接输出他们两个的地址,会发现,地址是不同的
// 如上所说,Spring 容器中,作用域为 prototype 的 Bean 可以有若干
}