我正在使用Spring boot,我想知道是否有一种方法可以在每次调用特定方法时创建一个新实例。
[我的意思是,我有一个单例对象专用于创建自动连接类的新实例,我希望每次我调用函数init
时,并且仅在调用它时,才创建该对象的新实例。
@Component
public class PlatformFactoryManager {
@Autowired
private JiraFactory jiraFactory;
/**
* Obtain new factory instance of specified platform.
*/
public IPlatformFactory getNewInstance(UserAccount userAccount, AuthenticationService authService, PlatformBean platform) {
switch (platform.getPlatformName()) {
case "Jira Restaurantes":
jiraFactory.init(authService.getBy(userAccount.getUserId(), Platforms.JIRA_RESTAURANTES), platform);
return jiraFactory;
case "Jira Yapiko":
jiraFactory.init(authService.getBy(userAccount.getUserId(), Platforms.JIRA_YAPIKO), platform);
return jiraFactory;
case "Jira FDJGS":
jiraFactory.init(authService.getBy(userAccount.getUserId(), Platforms.JIRA_FDJGS), platform);
return jiraFactory;
default:
return null;
}
}
}
@Component
public class JiraFactory implements IPlatformFactory {
@Autowired
private JiraBroker jiraBroker;
private String platformName;
private String url;
public void init(UserAuthentication credentials, PlatformBean platform) {
this.platform = platform;
this.credentials = credentials;
jiraBroker.init(platform.getUrl());
}
...
}
我每次调用JiraFactory
时都希望有一个init
的新实例,并且在使用其他方法时要成为同一对象。
有什么办法吗?
看看the @Prototype
scope。您可以重构您的@Prototype
组件,使其看起来像这样:
JiraFactory
并且在public class JiraFactory implements IPlatformFactory {
private final JiraBroker jiraBroker;
private String platformName;
private String url;
public JiraFactory(final JiraBroker jiraBroker, UserAuthentication credentials, PlatformBean platform) {
this.jiraBroker=jiraBroker;
this.platform = platform;
this.credentials = credentials;
jiraBroker.init(platform.getUrl());
}
}
类中,您可以将@Configuration
bean创建为原型bean
JiraFactory
请记住,Spring不管理那些bean,这意味着可能发生内存泄漏。
[在某些方面,当谈论原型作用域的bean时,您可以想到Spring容器的作用,在某种程度上可以替代Java'new'运算符。超过这一点的所有生命周期方面都必须由客户端处理。
意思是,您必须以某种方式跟踪那些bean,并确保在某些时候不存在对它们的引用以便将它们进行垃圾回收。