有一个疑问:@Scope的变化导致控制台输出的变化,这说明了什么?(单元测试方法始终没变,最后一张图)

来源:4-7 Spring Bean装配之基于Java的容器注解说明——@Bean和@Scope

java家洼

2016-05-07 13:44

572d7f250001259105000300.jpg

572d7f2a0001453605000296.jpg

572d7f2b0001d94b05000271.jpg

572d7f2c000103cb05000269.jpg

最后一张图是单元测试方法,始终没变。改变的是@Scope的属性值,随之改变的是控制台输出的结果,请问为什么把作用域变成prototype,控制台就没有bean的销毁信息了?为什么加了代理,初始化信息和销毁信息都不见了?

跪求大神,大牛帮忙说一下。

写回答 关注

3回答

  • hiberk
    2016-05-08 15:27:41
    已采纳

    prototype 作用域和singleton不一样,prototype不会自动销毁对象,同一个容器中每次请求都会创建新的对象。你在prototype的注解的时候,在手动关闭容器。即可输出。 加一句 ctx.registerShutdownHook(); 即可手动关闭容器销毁对象,这样就能执行到destroy的方法

    java家洼

    非常感谢!

    2016-05-08 17:56:53

    共 2 条回复 >

  • hiberk
    2016-05-11 17:57:16

    首先,关于对象回收机制,Java有自己的一套算法。一般是当对象不被使用(手动关闭,或者超过一段时间未使用。因为Java回收机制会以一个时间段扫描)就自动回收;另外,单例和静态在某种程度上是一样的。spring容器可以创建多个,一个容器里面又可以生成多个对象,如果你理解为静态,那么同一个容器的对象是一样的。但是不同容器之间的对象就不一样了(内存地址不一样),所以你这么理解也可以,那么就是静态类部类那种形式了。但是单例最主要的是的作用是线程安全!你可以看看单例模式的Java代码

    java家洼

    感谢你的耐心回答,谢谢。

    2016-05-11 18:09:33

    共 1 条回复 >

  • java家洼
    2016-05-08 18:00:52

    另外我有我自己的理解:我觉得scope=prototype的时候,创建的对象不会随着容器的关闭而被销毁,这些对象是垃圾回收器随机销毁的吧?另外我把单例理解为static的,是和容器生死相随的。即容器被创建就有单例,容器关闭,单例就被销毁。我的理解不知道对不对?

Spring入门篇

为您带来IOC和AOP的基本概念及用法,为后续高级课程学习打下基础

268802 学习 · 1026 问题

查看课程

相似问题