2015-11-12 25 views
1

我對Spring很陌生。我之前使用它來創建一個REST API,我現在再次使用它來達到同樣的目的。Spring RestController與其他Java類進行交互

除了託管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(); 
    } 
} 

我想我明白,我們可以做這樣的事情上面,但是當我們真正需要的是從main方法實例parser這造成的SSHParser一個新的實例。

這是我們只是不打算與Spring框架?是否有可能自己調用​​其餘控制器的構造函數來傳遞參考?

回答

2

你應該創建SSHParser對象作爲Spring bean,以便使用@Autowired註釋進行注入。您的應用程序類更改是這樣的:

@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實例。

0

爲了能夠自動裝配它,你需要將其配置爲一個Spring bean:

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

的@Configuration類和方法的名稱可能會叫你喜歡什麼

+1

'@ SpringBootApplication'是'@ Configuration'和其他註釋的包裝,所以不需要創建另一個配置類 –

+0

@Daniel Olszewski:好的。不知道 - 但看到你的解決方案指出了。它當然更短。 – morsor

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

+0

這也使得你的代碼無法測試,因爲它可以防止你從根本上嘲弄或嘲笑對SSHParser的引用 –

+0

與Spring注入相比,這是事實。但是你仍然可以使用框架來測試靜態方法爲[PowerMock](http://stackoverflow.com/questions/21105403/mocking-static-methods-with-mockito)。它使用另一個框架,可能很煩人,但有一個解決方案=) 但無論如何,我更喜歡你的解決方案(這是我不知道的)。 – RPresle

0

你不需要在主要方法中自己實例化SShParser。使用ApplicationContext從彈簧中拉出它。

@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的一個實例,並將其用於所有需要它的服務。