java - 如何仅为一个特定类创建新的 Spring bean,而不是为应用程序的其余部分创建 Singleton

标签 java spring dependency-injection

我有一个 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/

相关文章:

java - 如何使用java中的模式匹配器找到精确单词的匹配

java - JPA 和 JSON 运算符 native 查询

java - 对 JBoss web.xml 的更改无效

java - 使用@RequestMapping 时是否可以快速查找 url 到 Controller 的映射?

java - 如何修复 "com.jdbc.SQLServerException: Invalid column name ' taxi_id' "

c# - 无法从基类构造函数获取值

java - 为什么在使用 @RunWith(SpringJUnit4ClassRunner.class) 时,JUnit 4.12 会针对 assertEquals 抛出 NoSuchMethodError?

java - Spring:从 Web 应用程序线程子线程(来自 ThreadPool)访问请求( session )作用域 Bean

java - 使用 Spring 的第 3 方单例类的依赖注入(inject)

c# - Ninject:将接口(interface)绑定(bind)到多个实现