Java 新实例Spring范围
我正在使用SpringBoot,我想知道是否有办法在每次调用特定方法时创建一个新实例 我的意思是,我有一个单例对象专门用于创建自动连接类的新实例,我希望每次调用函数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
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?
}
}
}