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

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

572d7f250001259105000300.jpg

572d7f2a0001453605000296.jpg

572d7f2b0001d94b05000271.jpg

572d7f2c000103cb05000269.jpg

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

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

提问者:java家洼 2016-05-07 13:44

个回答

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

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

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

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

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

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