0

У меня есть приложение, и теперь я пытаюсь использовать 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 
    } 
+0

Я бы не стал зависеть от службы. Это выглядит неправильно. Если вам это действительно нужно, то явным образом передаю службу в конструкторе комнаты или сделаю Room прототипом bean и использую контекст приложения Spring, чтобы получить экземпляр. –

+0

«Сделайте комнату прототипом bean и используйте контекст приложения Spring, чтобы получить экземпляр». Наверное, это то, что я хочу сейчас, но я новичок в Spring, пожалуйста, покажите мне, как это сделать в ответ? Спасибо! – Jaskey

+0

http://stackoverflow.com/questions/22155832/spring-java-config-how-do-you-create-a-prototype-scoped-bean-with-runtime-argu –

ответ

0

В конце концов, я могу решить эту проблему с помощью позволяя AbstractRoom как боб с объемом = прототипа, и возвращает экземпляр из RoomService компонента.

@Configuration 
@EnableAspectJAutoProxy 
public class Application {  
    @Bean 
    public CommandService commandService(){ 
     return new CommandService(); 
    } 

    @Bean 
    public RoomService roomService(){ 
     return new RoomService(); 
    } 

    @Bean 
    public GameService gameService(){ 
     return new GameService(); 
    } 

    @Bean 
    @Scope("prototype") 
    public AbstractRoom room(AbstractRoom.Mode roomMode){ 
     RoomService roomService = roomService(); 
     return roomService.newRoom(roomMode); 
    } 

И в RoomService.java, вводят в ApplicationContext, и получить номер из контейнера.

public class RoomService { 

    @Autowired 
    private ApplicationContext ctx; 

    public AbstractRoom createRoom(String userID,int playerCount,Mode roomMode){ 
     AbstractRoom room = (AbstractRoom)ctx.getBean(AbstractRoom.class,roomMode); 
    } 
} 
Смежные вопросы