2013-04-10 45 views
0

我需要從彈簧工廠獲取一個具有構造函數參數的對象,並在運行時指定其值。我該怎麼做呢。如果我沒有任何構造函數,這工作得很好。使用構造函數自動裝配對象

@Service 
public class PortService implements Runnable { 

@Autowired 
LeaveProcessor leaveProcessor; 

private Socket socket; 

public PortService(Socket socket) { 
    this.socket = socket; 
} 

public void run() { 
    PrintWriter writer; 
    BufferedReader reader; 
    try { 
     reader = new BufferedReader(new InputStreamReader(
       socket.getInputStream())); 
     String message = reader.readLine(); 
     writer = new PrintWriter(socket.getOutputStream(), true); 
     writer.println(leaveProcessor.process(message)); 
     writer.close(); 
     socket.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
} 

編輯 - 無構造函數我可以通過直接訪問Autowireed對象leaveProcessor來使其工作。

插座:這是從工廠裝:

public void start() { 

    try { 
     ServerSocket mobCom = new ServerSocket(9846); 
     ExecutorService executorService = Executors.newCachedThreadPool(); 

     while (true) { 
      Socket socket = mobCom.accept(); 
      PortService portService = new PortService(socket); 
      executorService.submit(portService); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 
+0

誰在傳遞'socket' – 2013-04-10 06:53:35

+0

看@Configurable,這將需要aspectj加載時間編織。創建一個由Spring管理的Factory類然後用它來創建對象的最佳選擇。 – gkamal 2013-04-10 06:58:18

回答

0

您需要實現一個工廠bean

public class PortServiceFactory implements FactoryBean<PortService> { 
    PortService getObject() { 
     Socket socket; 
     // Code to initialize the socket 
     return new PortService(socket); 
    } 
    // FactoryBean interface requires a couple of other methods, 
    // implement those 
} 
+0

更新的問題,還涉及到線程 – 2013-04-10 06:56:15

0

從context.xml文件本身傳遞的構造函數的參數。

<bean id="theBeanID" class="your.package.PortService" > 
     <constructor-arg ref="socketBeanID" /> 
    </bean> 

    <bean id="socketBeanID" class="your.package.Socket" /> 

我不知道你是如何創建的Socket對象,但必須傳遞給構造你的XML上下文文件本身內。

如果您可以避免使用構造函數,請自動套接Socket類本身。

@Autowired 
private Socket socket; 

OR,PortService本身使用關鍵字實例化它在你的班級。或者,如果需要,使用一些創建Socket對象的靜態工廠方法。

相關問題