如何在 spring 中获取同一个 bean 的多个实例?
how to get multiple instances of same bean in spring?
默认情况下,spring bean 是单例。我想知道是否有办法获取同一个 bean 的多个实例进行处理。
这是我目前所做的
@Configuration
public class ApplicationMain {
@Value("${service.num: not configured}")
private int num;
//more code
@PostConstruct
public void run(){
for (int i = 0; i < num ; i++) {
MyService ser = new MyService(i);
Future<?> tasks = executor.submit(ser);
}
}
}
这是服务class
public class MyService implements Runnable {
private String name;
public Myservice(int i){
name=String.ValueOf(i);
}
}
我在这里简化了我的用例。
我想将 MyService 作为 spring bean,并根据上述 for 循环中的配置(即 num
)获得尽可能多的服务?想知道这怎么可能。
谢谢
首先,您必须制作 MyService
一个 Spring bean。您可以通过使用 @Component
注释 class 来做到这一点。接下来,正如您所说,Spring beans 默认情况下是单例,因此可以通过另一个注释来更改 - @Scope("prototype")
.
原型 bean 作用域意味着每次您向 Spring 请求 bean 的一个实例时,都会创建一个新实例。这适用于自动装配,使用 getBean()
询问 bean 的应用程序上下文,或使用 bean 工厂。
这是一个简单的例子,说明如何注册所需数量的相同类型的 bean
@Configuration
public class MultiBeanConfig implements ApplicationContextAware {
@Value("${bean.quantity}")
private int quantity;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
for (int i = 0; i < quantity; i++) {
((ConfigurableApplicationContext)applicationContext).getBeanFactory()
.registerSingleton("my-service-" + i, new MyService());
}
assert(applicationContext.getBeansOfType(MyService.class).size() == quantity);
}
class MyService {
}
}
默认情况下,spring bean 是单例。我想知道是否有办法获取同一个 bean 的多个实例进行处理。
这是我目前所做的
@Configuration
public class ApplicationMain {
@Value("${service.num: not configured}")
private int num;
//more code
@PostConstruct
public void run(){
for (int i = 0; i < num ; i++) {
MyService ser = new MyService(i);
Future<?> tasks = executor.submit(ser);
}
}
}
这是服务class
public class MyService implements Runnable {
private String name;
public Myservice(int i){
name=String.ValueOf(i);
}
}
我在这里简化了我的用例。
我想将 MyService 作为 spring bean,并根据上述 for 循环中的配置(即 num
)获得尽可能多的服务?想知道这怎么可能。
谢谢
首先,您必须制作 MyService
一个 Spring bean。您可以通过使用 @Component
注释 class 来做到这一点。接下来,正如您所说,Spring beans 默认情况下是单例,因此可以通过另一个注释来更改 - @Scope("prototype")
.
原型 bean 作用域意味着每次您向 Spring 请求 bean 的一个实例时,都会创建一个新实例。这适用于自动装配,使用 getBean()
询问 bean 的应用程序上下文,或使用 bean 工厂。
这是一个简单的例子,说明如何注册所需数量的相同类型的 bean
@Configuration
public class MultiBeanConfig implements ApplicationContextAware {
@Value("${bean.quantity}")
private int quantity;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
for (int i = 0; i < quantity; i++) {
((ConfigurableApplicationContext)applicationContext).getBeanFactory()
.registerSingleton("my-service-" + i, new MyService());
}
assert(applicationContext.getBeansOfType(MyService.class).size() == quantity);
}
class MyService {
}
}