我想更好地理解如何在我的應用程序中實現構造函數注入。我有一些由SimpleMessageListenerContainer工作者執行的後臺進程,它們將消息從AMQP服務器中提取出來。SimpleMessageListenerContainer中的構造函數注入
我的應用程序包含服務層和回購層,工作人員使用服務進行數據讀取/寫入。我的控制器,服務和倉庫都是使用構造函數注入來設置的,但是因爲需要實例化新版本的工人,所以我不知道如何初始化工人。
工人
public class RandomWorker extends Worker {
private UserService userService;
@Autowired
public RandomWorker(UserService userService) {
this.userService = userService;
}
@Override
public byte[] handleMessage(byte[] message) {
... do work ...
}
}
服務層
@Service
public class UserService {
private SecurityAreaRepo securityAreaRepo;
private SecurityRoleRepo securityRoleRepo;
private UserRepo userRepo;
@Autowired
public UserService(SecurityAreaRepo securityAreaRepo,
SecurityRoleRepo securityRoleRepo,
UserRepo userComponent) {
this.securityAreaRepo = securityAreaRepo;
this.securityRoleRepo = securityRoleRepo;
this.userRepo = userRepo;
}
}
WorkerConfig
@Configuration
public class WorkerConfig {
@Bean
public RandomWorker randomWorker() {
return new RandomWorker();
}
@Bean(name="randomWorkerContainer")
public SimpleMessageListenerContainer randomWorkerContainer() {
SimpleMessageListenerContainer smlc = new SimpleMessageListenerContainer();
smlc.setConnectionFactory(connectionFactory());
smlc.setMessageListener(new MessageListenerAdapter(randomWorker(), "handleMessage"));
smlc.setQueueNames("random.worker.queue");
smlc.setConcurrentConsumers(5);
smlc.start();
return smlc;
}
}
由於我的工人要求UserService,我必須在我初始化提供了這樣的一個實例在WorkerConfig新的RandomWorker。那麼,我將不得不爲所有工作人員使用的EVERY服務創建一個@Bean?我WorkerConfig會是這個樣子:
@Configuration
public class WorkerConfig {
@Bean
public UserService userService() {
return new UserService(new SecurityAreaRepo(), new SecurityRoleRepo(), new UserRepo());
}
@Bean
public RandomWorker randomWorker() {
return new RandomWorker(userService());
}
@Bean(name="randomWorkerContainer")
public SimpleMessageListenerContainer randomWorkerContainer() {
SimpleMessageListenerContainer smlc = new SimpleMessageListenerContainer();
smlc.setConnectionFactory(connectionFactory());
smlc.setMessageListener(new MessageListenerAdapter(randomWorker(), "handleMessage"));
smlc.setQueueNames("random.worker.queue");
smlc.setConcurrentConsumers(5);
smlc.start();
return smlc;
}
}
如果是這樣的話,我只是沒有看到構造函數注入點,當領域注入使得一切都那麼簡單得多。有人可以對此有所瞭解嗎?
感謝您的建議!當我嘗試實現這一點時,Spring會抱怨「沒有發現'UserService'類型的bean」。這是否意味着我的服務在上下文中不可用? 此外,我將如何修改我的randomWorkerContainer()方法,它調用randomWorker()Bean來啓動一個新的工作?這些服務是否也會被注入? –
是的,這意味着用戶服務在上下文中不可用。您可以用'@ Service'註釋用戶服務類並將'@ ComponentScan'添加到'@ Configuration'配置類中。至於randomWorkerContainer - 只需將RandomWorker類型的paramarter添加到容器Bean方法。 –
太棒了!我在錯誤的文件中有我的@ComponentScan。現在一切正常,謝謝! –