Spring - 在Main

时间:2017-04-30 18:46:22

标签: java spring spring-mvc spring-annotations

我的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;

1 个答案:

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