我有一个 EmployeeService Spring Service 类,我将其注入(inject)到我的应用程序中的各个位置,例如
public class ClassX {
@Bean
EmployeeService employeeService;
}
public class ClassW {
@Bean
EmployeeService employeeService;
}
这就是 EmployeeService bean 的样子(不确定这对答案是否重要)
public class EmployeeService {
@Bean
SalaryService salaryService;
@Bean
IdentificationService identificationService;
}
如果我没记错的话,在整个应用程序上下文中,EmployeeService bean 将是相同的,即单例(除非另有定义)
但是有一个地方我想使用 EmployeeService bean,该 bean 不会被任何其他类共享。比如说
public class ClassY {
@Bean
EmployeeService employeeService;
}
仅在 ClassY 中,我希望该 bean 是一个新的 bean,而不是应用程序其余部分使用的 bean。
我是 Spring 新手,所以不知道如何准确定义我正在搜索的内容,因为我不完全熟悉该框架的语言和术语。
如果问题不清楚并且需要更多信息,请随时告诉我。
附注我正在为 Spring 和应用程序的其余部分使用 XML 配置,即除了 ClassY 之外,我希望 EmployeeService bean 仅是一个单例
最佳答案
您可以定义两个不同的@Beans
,并使用@Qualifier
来区分。
在 Java 配置中:
@Bean //This bean is singleton by default
@Qualifier("employeeServiceA")
public EmployeeService employeeServiceA() {
new EmployeeService();
}
@Bean
@Qualifier("employeeServiceB")
@Scope("prototype")
public EmployeeService employeeServiceB() {
new EmployeeService();
}
当@Autowired
只是您需要的@Qualifier
值时
@Autowired
@Qualifier("employeeServiceB")
private EmployeeService employeeService;
对于 XML 配置,只需定义 bean 的 id
,然后使用此 id 作为 @Qualifier
值。
<bean id="employeeServiceA" class="com.package.to.EmployeeService">
<bean id="employeeServiceB" scope="prototype" class="com.package.to.EmployeeService">
还有@Primary
。使用此注释对单例 bean 进行注释,您将不需要使用 @Qualifier
来指示您需要注入(inject)此 bean。
XML 配置相同:
<bean id="employeeServiceA" primary="true" class="com.package.to.EmployeeService">
附注不要使用现场注入(inject)。这被认为是一种不好的做法。请改用构造函数注入(inject)。
关于java - 如何仅为一个特定类创建新的 Spring bean,而不是为应用程序的其余部分创建 Singleton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42991111/