[英]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.