用构造函数自动生成对象



我需要从弹簧工厂获得一个对象,该对象有一个构造函数参数,其值在运行时指定。我该怎么做呢?如果我没有任何构造函数,这可以很好地工作。

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

编辑-没有构造函数,我可以通过直接访问autowired对象leaveProcessor使其工作。

Socket: This is loaded from factory:

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对象。

最新更新