包括Singleton、Prototype、Request, Session, Application, WebSocket,这边主要讲常用的Singleton和Prototype。
当定义一个bean为单例对象时,IoC容器只创建该bean对象的一个实例。这个bean对象存储在容器的缓存(map)中,后续的对该bean的引用,都是从缓存中取(map.get)。
这个单例跟设计模式的单例模式是不一样的。spring的单例是指在容器中仅有一个实例,而设计模式的单例是在JVM进程中仅有一个实例。
当需要每次getBean的时候,都返回不同的实例,这个时候,就需要用Prototype。
如果bean是无状态的,就需要用Singleton,如果是有状态的,就用Prototype。
对于Singleton的bean,spring容器会管理他的整个生命周期。
对于Prototype的bean,spring容器不管理他的整个生命周期,尽管初始化的方法会被调用,但是与scope的范围无关。而且容器关闭时不会调用销毁方法。
XML配置:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="singletonBean" class="com.learn.beanScope.SingletonBean" scope="singleton"/> <bean id="prototypeBean" class="com.learn.beanScope.PrototypeBean" scope="prototype"/> </beans>
测试代码
@Test public void test() { ApplicationContext app = new ClassPathXmlApplicationContext("beanScope.xml"); SingletonBean singletonBean1 = app.getBean("singletonBean",SingletonBean.class); SingletonBean singletonBean2 = app.getBean("singletonBean",SingletonBean.class); PrototypeBean prototypeBean1 =app.getBean("prototypeBean",PrototypeBean.class); PrototypeBean prototypeBean2 =app.getBean("prototypeBean",PrototypeBean.class); System.out.println(singletonBean1); System.out.println(singletonBean2); System.out.println(prototypeBean1); System.out.println(prototypeBean2); }
运行结果:
作用域为Singleton的时候,可以看出,从容器中取了两次,地址是一样的,所以是同一个bean。
作用域为Prototype的时候,可以看出,从容器中取了两次,地址是不一样的,所以不是同一个bean。
MyConfig
@Configuration public class MyConfig { @Bean @Scope("prototype") public PrototypeBean prototypeBean() { return new PrototypeBean(); } @Bean @Scope("singleton") public SingletonBean singletonBean() { return new SingletonBean(); } }
测试代码
@Test public void test() { ApplicationContext app = new AnnotationConfigApplicationContext(MyConfig.class); SingletonBean singletonBean1 = app.getBean("singletonBean",SingletonBean.class); SingletonBean singletonBean2 = app.getBean("singletonBean",SingletonBean.class); PrototypeBean prototypeBean1 =app.getBean("prototypeBean",PrototypeBean.class); PrototypeBean prototypeBean2 =app.getBean("prototypeBean",PrototypeBean.class); System.out.println(singletonBean1); System.out.println(singletonBean2); System.out.println(prototypeBean1); System.out.println(prototypeBean2); }
运行结果:
结果同XML。