我的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
}
StudentRepository:
@Repository
public interface StudentRepository extends CrudRepository<Student, Long> {
}
我已经尝试过这样:
TCPServer tcpServer = (TCPServer) applicationContext.getBean("tcpServer");
但这就是我得到的:
线程“main”中的异常org.springframework.beans.factory.NoSuchBeanDefinitionException:没有名为'tcpServer'的bean可用
修改
MySpringApplication
: com.example.myspringapp;
TCPServer
: com.example.myspringapp.server;
答案 0 :(得分:2)
如果该类被称为TCPServer
,则bean名称将为TCPServer
(显然,如果类名以大写字符序列开头,则Spring不会小写第一个字符)。对于bean名称tcpServer
,类名必须为TcpServer
。
或者,您可以在Component注释中指定bean名称:
@Component("tcpServer")
要按类型获取bean,必须使用正确的类型。如果您的类实现了一个接口而您没有指定
@EnableAspectJAutoProxy(proxyTargetClass = true)
在主配置类上,Spring将使用默认的JDK代理来创建bean,然后实现类的接口,而不是扩展类本身。因此,您的TCPServer
的bean类型为Runnable.class
而不是TCPServer.class
。
因此要么使用bean名称来获取bean,要么添加代理注释以将类用作类型。