新实例Spring Scope

问题描述 投票:0回答:1

我正在使用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的新实例,并且在使用其他方法时要成为同一对象。

有什么办法吗?

java spring spring-boot instance autowired
1个回答
0
投票

看看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,并确保在某些时候不存在对它们的引用以便将它们进行垃圾回收。

© www.soinside.com 2019 - 2024. All rights reserved.