@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()
?
1条答案
按热度按时间jobtbby31#
如果
ClassA
示例未在其他地方使用,它将符合gc的条件。当然,从那以后ClassB
是一个单例,由spring管理,它不会被收集。事实上classB
活着不在场classA
待收集。顺便说一句,你的评论有点不对劲:
你混淆了范围和可达性。如果在注解后面有更多的代码(但它不使用
classA
)它仍然可以在方法结束之前被收集。