最后一张图是单元测试方法,始终没变。改变的是@Scope的属性值,随之改变的是控制台输出的结果,请问为什么把作用域变成prototype,控制台就没有bean的销毁信息了?为什么加了代理,初始化信息和销毁信息都不见了?
跪求大神,大牛帮忙说一下。
prototype 作用域和singleton不一样,prototype不会自动销毁对象,同一个容器中每次请求都会创建新的对象。你在prototype的注解的时候,在手动关闭容器。即可输出。 加一句 ctx.registerShutdownHook(); 即可手动关闭容器销毁对象,这样就能执行到destroy的方法
首先,关于对象回收机制,Java有自己的一套算法。一般是当对象不被使用(手动关闭,或者超过一段时间未使用。因为Java回收机制会以一个时间段扫描)就自动回收;另外,单例和静态在某种程度上是一样的。spring容器可以创建多个,一个容器里面又可以生成多个对象,如果你理解为静态,那么同一个容器的对象是一样的。但是不同容器之间的对象就不一样了(内存地址不一样),所以你这么理解也可以,那么就是静态类部类那种形式了。但是单例最主要的是的作用是线程安全!你可以看看单例模式的Java代码
另外我有我自己的理解:我觉得scope=prototype的时候,创建的对象不会随着容器的关闭而被销毁,这些对象是垃圾回收器随机销毁的吧?另外我把单例理解为static的,是和容器生死相随的。即容器被创建就有单例,容器关闭,单例就被销毁。我的理解不知道对不对?