我的TCPServer类实现了Runnable,并用@Component进行了注释。
我有一个ThreadPoolTaskExecutor将运行TCPServer

TCPServer中,我还有一个用@Repository注释的类。
如果我尝试调用taskExecutor.execute(new TCPServer()),它将不受Spring的管理,因此我的存储库对象将为null。

如何在TCPServer中获取Main的实例,以便将其提供给taskExecutor?

TCPServer:

@Component
@Scope("prototype")
public class TCPServer implements Runnable {

  @Autowired
  private StudentRepository studentRepository;
  //rest of code
}


学生资料库:

@Repository
public interface StudentRepository extends CrudRepository<Student, Long> {

}


我已经这样尝试过:

TCPServer tcpServer = (TCPServer) applicationContext.getBean("tcpServer");


但这就是我得到的:


  线程“主” org.springframework.beans.factory.NoSuchBeanDefinitionException:没有名为“ tcpServer”的bean可用


编辑:

MySpringApplication:com.example.myspringapp;

TCPServer:com.example.myspringapp.server;

最佳答案

如果将该类称为TCPServer,则Bean名称将为TCPServer(如果类名称以大写字符序列开头,则Spring不会将第一个字符小写)。对于bean名称tcpServer,类名称必须为TcpServer

另外,您可以在Component批注中指定bean名称:

@Component("tcpServer")


为了按类型获取bean,必须使用正确的类型。如果您的类实现了一个接口而您未指定

@EnableAspectJAutoProxy(proxyTargetClass = true)


在您的主配置类上,Spring将使用默认的JDK代理来创建bean,这些bean将实现类的接口,并且不会扩展类本身。因此,在您的情况下,TCPServer的bean类型是Runnable.class,而不是TCPServer.class

因此,要么使用bean名称来获取bean,要么添加代理注释以将类用作类型。

10-06 01:08