我对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框架无关?是否可以自己调用其余控制器的构造函数来传递引用?
答案 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实例,并将其与所有需要它的服务一起使用。