我的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,要么添加代理注释以将类用作类型。