簡體   English   中英

使用構造函數自動裝配對象

[英]Autowiring objects with constructor

我需要從spring工廠獲取一個具有構造函數參數的對象,該對象的值在運行時指定。 我該怎么做呢。 如果我沒有任何構造函數,則此方法效果很好。

@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();
    }
}
}

編輯-沒有構造函數,我可以通過直接訪問自動裝配的對象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();
    }

}

您將需要實現一個工廠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
}

從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;

或者,使用new關鍵字在您的類PortService本身中實例化它。

或者,使用一些靜態工廠方法(如果需要)來創建Socket對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM