Spring RestController与其他Java类交互

时间:2015-11-12 07:28:03

标签: java spring rest

我对Spring很新。我之前使用它来制作REST API,我现在再次使用它来达到同样的目的。

除了托管REST服务之外,该程序还重复打开文件,扫描模式,并维护其发现的结构。

现在我们在这里启动控制流程。

@SpringBootApplication
@EnableWebSecurity
public class Application {

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
    SSHParser parser = new SSHParser();
    parser.startParserLoop();
  }
}

在RestController中,我们希望引用该解析器对象,以便我们可以在HTTP请求方法中使用它。

@RestController
public class RestController {

  @Autowire
  SSHParser parser;

  @RequestMapping("/api/list")
  public Entry[] getList()  {
    return parser.list();
  }
}

我想我知道我们可以做上面这样的事情,但是当我们真正需要的是来自SSHParser方法的实例parser时,这会创建一个main的新实例。 / p>

这是否与Spring框架无关?是否可以自己调用其余控制器的构造函数来传递引用?

4 个答案:

答案 0 :(得分:2)

您应该将SSHParser对象创建为Spring bean,以便可以使用@Autowired注释进行注入。将您的Application类更改为以下内容:

@SpringBootApplication
@EnableWebSecurity
public class Application {

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }

  @Bean
  public SSHParser sshParser() {
    SSHParser parser = new SSHParser();
    parser.startParserLoop();
    return parser;
  }

}

此代码与您的代码完全相同,但此外,它允许在Spring容器管理的其他对象中重用已创建的实例。默认情况下,Spring在单例范围内创建一个bean,因此您只有一个SSHParser实例。

答案 1 :(得分:0)

为了能够自动装配它,您需要将其配置为Spring bean:

@Configuration
public class AppConfig {
    @Bean
    public SSHParser createSSHParser() {
        SSHParser parser = new SSHParser();
        parser.startParserLoop();
        return parser;
    }
}

@Configuration类和方法名称可以根据需要调用

答案 2 :(得分:0)

此时您也在控制器中注入SSHParser。如果您只想拥有一个SSHParser实例,那么您应该考虑使用singleton pattern

puclic class SSHParser {
    private static SSHParser instance;
    private SSHParser() {
    //private constructor, no one can instanciate this class
    }
    public static SSHParser getInstance() {
        if(SSHParser.instance==null) {
            SSHParser.instance = new SSHParser();
        }
        return SSHParser.instance;
    }
}

然后在你的控制器中调用getInstance方法来获取一个唯一的实例。如果您无法修改SSHPArser类,则可以设置包装器或Factory

答案 3 :(得分:0)

您不需要在main方法中自己实例化SShParser。使用ApplicationContext从spring中拉出它。

@SpringBootApplication
@EnableWebSecurity
public class Application {

   public static void main(String[] args) {
      ConfigurableApplicationContext context=SpringApplication.run(Application.class, args);
      SSHParser parser = (SSHParser) context.getBean(SSHParser .class);
      parser.startParserLoop();
  }
}

spring将只创建一个SSHParser bean实例,并将其与所有需要它的服务一起使用。