Java 新实例Spring范围

Java 新实例Spring范围,java,spring,spring-boot,instance,autowired,Java,Spring,Spring Boot,Instance,Autowired,我正在使用SpringBoot,我想知道是否有办法在每次调用特定方法时创建一个新实例 我的意思是,我有一个单例对象专门用于创建自动连接类的新实例,我希望每次调用函数init,并且只有在调用它时,才会创建该对象的新实例 @Component public class PlatformFactoryManager { @Autowired private JiraFactory jiraFactory; /** * Obtain new factory inst

我正在使用SpringBoot,我想知道是否有办法在每次调用特定方法时创建一个新实例

我的意思是,我有一个单例对象专门用于创建自动连接类的新实例,我希望每次调用函数
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;
        }
    }

}
我希望每次调用
init
时都有一个新的
JiraFactory
实例,并在使用其他方法时成为同一个对象

有什么办法吗?

看看。 您可以重构
JiraFactory
组件,使其看起来像这样:

公共类JiraFactory实现IPlatformFactory{
非公开最终经纪人;
私有字符串平台名;
私有字符串url;
公共JiraFactory(最终JiraBroker JiraBroker、用户身份验证凭据、PlatformBean平台){
this.jiraBroker=jiraBroker;
这个平台=平台;
this.credentials=凭证;
init(platform.getUrl());
}
}
@Configuration
类中,您可以创建
JiraFactory
bean作为原型bean

@Configuration
class JiraConfig {
   @Bean
   @Scope("prototype")
   public IPlatformFactory iPlatformFactory(final JiraBroker jiraBroker, final JiraBroker jiraBroker, UserAccount userAccount, AuthenticationService authService, PlatformBean platform) {
        switch (platform.getPlatformName()) {
            case "Jira Restaurantes":
                return new JiraFactory (jiraBroker, authService.getBy(userAccount.getUserId(), Platforms.JIRA_RESTAURANTES), platform);
            case "Jira Yapiko":
                return new JiraFactory (jiraBroker, authService.getBy(userAccount.getUserId(), Platforms.JIRA_YAPIKO), platform);
            case "Jira FDJGS":
                return new JiraFactory (jiraBroker, authService.getBy(userAccount.getUserId(), Platforms.JIRA_FDJGS), platform);
            default:
                return null; // maybe better throw exception?
        }
    }
}
原型bean的行为类似于“普通”(单例)bean,您将能够
@Autowire
其中的其他服务。但是,请记住,Spring并不管理这些bean的生命周期,这意味着它可能是内存泄漏

在某些方面,当谈到原型范围的bean时,您可以将springcontainers角色看作是Java“new”操作符的替代品。客户必须处理超过该点的所有生命周期方面

也就是说,您必须以某种方式跟踪这些bean,并确保在某个时刻,不存在对它们的引用,以便对它们进行垃圾收集


旁注,通常建议避免使用
init()
方法。在大多数情况下,可以用构造函数替换它们。如果无法使用它们,您可以尝试使用
@PostConstruct
而不是手动调用它们

@组件
类MyComponent{
@施工后
创建bean/组件后,Spring将调用public void init(){//
System.out.println(“组件已创建!”);
}
}

您可以向组件添加
@Scope(scopeName=ConfigurableBeanFactory.Scope\u PROTOTYPE)
注释,看起来您只需调用
新的JiraFactory()
在您的
init
方法中。如果您想要新实例,请每次使用
new JiraBroker
,而不是
@Autowired private JiraBroker JiraBroker。因为
@Autowired
一开始只创建一个实例如果我调用
new
它会破坏我在
JiraBroker
中的自动连接变量吗?你想解决什么问题?每次我使用该对象时,它都会创建一个新实例,我不想这样,我只想在调用这个特定方法时创建一个新实例。谢谢您的时间。但是我希望
JiraFactory
JiraBroker
都在Spring范围内自动关联其他变量,因此您的解决方案无法解决我的问题。您可以在
prototype
范围内的bean中自动关联其他变量。
@Configuration
class JiraConfig {
   @Bean
   @Scope("prototype")
   public IPlatformFactory iPlatformFactory(final JiraBroker jiraBroker, final JiraBroker jiraBroker, UserAccount userAccount, AuthenticationService authService, PlatformBean platform) {
        switch (platform.getPlatformName()) {
            case "Jira Restaurantes":
                return new JiraFactory (jiraBroker, authService.getBy(userAccount.getUserId(), Platforms.JIRA_RESTAURANTES), platform);
            case "Jira Yapiko":
                return new JiraFactory (jiraBroker, authService.getBy(userAccount.getUserId(), Platforms.JIRA_YAPIKO), platform);
            case "Jira FDJGS":
                return new JiraFactory (jiraBroker, authService.getBy(userAccount.getUserId(), Platforms.JIRA_FDJGS), platform);
            default:
                return null; // maybe better throw exception?
        }
    }
}