java—包含单例bean的原型bean在使用后是否会被垃圾收集?

oknrviil  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(350)
@Component
class ClassB {
    //Singleton class which is being used in classA
    public void doSomething() {
        System.out.println("did something");
    }
}

@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
class ClassA {
    //Prototype class which is being used in Main class

    @Autowired
    ClassB classb;

    public void methodA() {
        //do something
        classb.doSomething();
    }

}

@Component
class Main {

    @Autowired
    ApplicationContext applicationContext;

    public void createAndUseClassA() {
        //Spring would create a new instance of classA
        var classA = applicationContext.getBean(ClassA.class);  
        //used class A
        classA.methodA();
        //after this method ends there would be no reference of classA
    }
}

在上述情况下 Main 类要求spring创建一个原型bean的示例( ClassA )它用在里面 createAndUseClassA() 方法。现在根据spring文档:
https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-工厂范围原型
spring在创建后不保留对原型bean的任何引用,但是spring在spring上下文中保留对单例bean的引用。所以在这种情况下,在方法之后 createAndUseClassA() 完成时,将没有对所引用对象的引用 classA ,但spring上下文将引用 ClassB ,位于对象内部 ClassA . 我的问题是这是否会阻止gc收集 ClassA 合同执行后 createAndUseClassA() ?

jobtbby3

jobtbby31#

如果 ClassA 示例未在其他地方使用,它将符合gc的条件。当然,从那以后 ClassB 是一个单例,由spring管理,它不会被收集。事实上 classB 活着不在场 classA 待收集。
顺便说一句,你的评论有点不对劲:

//after this method ends there would be no reference of classA

你混淆了范围和可达性。如果在注解后面有更多的代码(但它不使用 classA )它仍然可以在方法结束之前被收集。

相关问题