У меня есть приложение, и теперь я пытаюсь использовать Spring для его рефакторинга, и у меня возникает проблема при создании объекта с использованием new
, но я не знаю, как его решить.Spring Injected bean null при создании объекта с новым, как его решить?
Вот realtionship:
У меня есть Controller
, нужен CommandService
экземпляр, а CommandService
нужен RoomService
создать AbstractRoom
экземпляры поместить в HashMap RoomService
экземпляра.
У меня есть два вида AbstractRoom
под названием Rooma, RoomB, и они простираются от AbstractRoom
и AbstractRoom
потребности GameService
экземпляра.
Я передам парам из commandService в roomService, чтобы roomervice мог создать правильный экземпляр комнаты.
Проблема в том, что я использую roomervice.createRoom, чтобы создать комнату, в которой используется new
. Поэтому Spring не может вводить GameService в мою Абстрактную комнату, таким образом, у меня есть null gameService.
Но CommandService получит некоторые входной сигнал от пользователя и делегировать RoomService
, чтобы создать пространство для этого, так что я не знаю, какой номер экземпляр будет создан до пользовательского ввода-то:
CommandService.java:
private String handleCreateRoom(String userID, int playerCount,
Mode roomMode) {
...
AbstractRoom theNewRoom=roomService.createRoom(userID, playerCount, roomMode);
...
}
Вот как я createRoom от RoomService.java:
public AbstractRoom createRoom(String userID,int playerCount,Mode roomMode){
AbstractRoom room = newRoom(roomMode);// create a room based on the roomMode
room.initRoom(userID, playerCount);// init the room
userToRoom.put(userID, room.getRoomNum());//some context
return room;
}
public AbstractRoom newRoom(AbstractRoom.Mode roomMode) {
Integer randomNumObject;
AbstractRoom newRoom;
.....
if(roomMode.equals(Mode.AUTO_JUDGE)||roomMode.equals(Mode.PLAYER_JUDGE)){//wodi room
newRoom=new RoomA(randomNumObject,roomMode);//RoomA
}
....
else{//RoomB
newRoom=new RoomB(randomNumObject);
}
roomMap.put(randomNumObject, newRoom);//some context
return newRoom;
}
Вот мой AbstractRoom.java
public abstract class AbstractRoom {
protected Mode roomMode;
@Autowired
protected GameService gameService;
.....
}
И моя конфигурация:
@Configuration
@EnableAspectJAutoProxy
public class Application {
@Bean
public CommandService commandService(){
return new CommandService();//singleton
}
@Bean
public RoomService roomService(){
return new RoomService();//singleton
}
@Bean
public GameService gameService(){
return new GameService();//singleton
}
Я бы не стал зависеть от службы. Это выглядит неправильно. Если вам это действительно нужно, то явным образом передаю службу в конструкторе комнаты или сделаю Room прототипом bean и использую контекст приложения Spring, чтобы получить экземпляр. –
«Сделайте комнату прототипом bean и используйте контекст приложения Spring, чтобы получить экземпляр». Наверное, это то, что я хочу сейчас, но я новичок в Spring, пожалуйста, покажите мне, как это сделать в ответ? Спасибо! – Jaskey
http://stackoverflow.com/questions/22155832/spring-java-config-how-do-you-create-a-prototype-scoped-bean-with-runtime-argu –