这个对象在什么时候创建的呢?可以为SpringBean提供一个无参数构造方法,测试一下,如下:阐明:无论是执行多少次,applicationContext.getBean ,照旧启动多个线程,都是同一个User对象. 是单例的
- 无参构造方法仅仅只被调用了一次
- 四个user对象,的地址是一样的
从结果上来看:是在 new ClassPathXmlApplicationContext() 的时候就已经,执行了构造方法(Bean对象的创建是在初始化Spring上下文的时候就完成的。)其中: singleton 是Spring框架 默认的,也是单例的。
通过测试得知,没有指定scope属性时,默认是singleton单例的。1.3 prototype
从结果上看:启动多个线程,也是会存在多个,user对象的地址的,同时调用多次无参数构成方法()——> 是多例 的。 不像 singleton(默认)的那样是无论是执行多少次,applicationContext.getBean ,照旧启动多个线程,都是同一个User对象单例的。
1.调用了两次无参数构成方法()
2.是两个不同的 user对象的地址
特别阐明: 假如大家,进行了一个实践测试代码,可能会发现,IDE工具,仅仅只提示了 scope属性值的两个值(singleton,prototype)。就算我们自己手动敲出了其他的值,也是会报红 。如下图所示:
- singleton:默认的,单例。
- prototype:原型。每调用一次getBean()方法则获取一个新的Bean对象。或每次注入的时候都是新对象。
- request:一个请求对应一个Bean。仅限于在WEB应用中使用。
- session:一个会话对应一个Bean。仅限于在WEB应用中使用。
- global session:portlet应用中专用的。假如在Servlet的WEB应用中使用global session的话,和session一个结果。(portlet和servlet都是规范。servlet运行在servlet容器中,例如Tomcat。portlet运行在portlet容器中。)
- application:一个应用对应一个Bean。仅限于在WEB应用中使用。
- websocket:一个websocket生命周期对应一个Bean。仅限于在WEB应用中使用。
- 自定义scope:很少使用。
我们可以,在 pom.xml 项目设置文件上,加上一个web 框架,比如:这里我们加上SpringMVC 就可以了。试试
哈哈哈,这个IDE不给我们提示就算了,还给我们报错。
其实这个并不是IDE工具的问题,而是,我们其他的对应的scope其他属性的值,是需要在特定的情况下才有用的。比如:我们这里的 request 是需要在 web 项目当中才是有用的 ,所以 IDE才给我们来了这么一个错误——》爆红了。
- 第一步:自定义Scope。(实现Scope接口)
- spring内置了线程范围的类:org.springframework.beans.factory.config.CustomScopeConfigurer,和 org.springframework.context.support.SimpleThreadScope可以直接用。
- 第二步:将自定义的Scope注册到Spring容器中。
从结果上,我们可以看出:2. 总结:
一个线程,调用了一次无参构造方法(),生产一个对象。
成功实现了。在同一个线程中,获取的Bean都是同一个。跨线程则是不同的对象。
3. 最后:
- 默认情况下,Spring的IoC容器创建的Bean对象是单例的。默认是singleton(单例的)
- 可以在bean标签中指定scope属性的值为:**prototype(多例),默认是singleton(单例的) **
- 同时要注意:scope属性的值不止两个,它一共包括8个选项:,其他的要在特定的设置下,才气使用,例如:request和session 要是在 web 框架才可以使用。
“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上汲取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |