【发布时间】:2016-02-17 20:30:09
【问题描述】:
作为大多数 Spring Boot 新用户,我对 @Autowired 有疑问:D
我在这里阅读了大量关于此注释的主题但仍然无法找到适合我的问题的解决方案。
假设我们有这个 Spring Boot 层次结构:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
类,我们想在每次调用时实例化它:
@Service
public class TestWire {
public TestWire() {
System.out.println("INSTANCE CREATED: " + this);
}
}
Out get 控制器,每个请求都会创建新的 SomeRepo 对象:
@RestController
public class CreatingRepo {
@RequestMapping("/")
public void postMessage() {
SomeRepo repo = new SomeRepo();
}
}
最后,使用@Autowired 创建TestWire 实例的类:
public class SomeRepo {
@Autowired
private TestWire testWire;
public SomeRepo() {
System.out.println(testWire.toString());
}
}
假设我们多次向“/”发出 GET 请求。
因此,TestWire 类仅在项目构建时才会实例化,并且 @Scope(value = "prototype") 和 proxyMode = ScopedProxyMode.TARGET_CLASS 都不会帮助。
任何想法如何在运行时创建新实例?我的意思是,我们如何以“春天的方式”做到这一点?没有工厂和其他东西,只有 Spring DI 通过注解和配置。
更新。一段堆栈跟踪,其中创建了实例:
2015-11-16 20:30:41.032 INFO 17696 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
INSTANCE CREATED: com.example.TestWire@56c698e3
2015-11-16 20:30:41.491 INFO 17696 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@12f41634: startup date [Mon Nov 16 20:30:37 MSK 2015]; root of context hierarchy
2015-11-16 20:30:41.566 INFO 17696 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/]}" onto public void com.example.CreatingRepo.postMessage()
【问题讨论】:
-
问题是您使用的是
new SomeRepo(),因此SomeRepo的实例不是由Spring 管理的。如果您希望/需要每次执行CreatingRepo#postMessage并使用new运算符并让 Spring 管理 bean 的实例(即启用自动装配功能和其他 Spring 产品)时获取 SomeRepo 的新实例,您可以使用@Configurable. -
@LuiggiMendoza 我已经更改了我的控制器,现在它使用
@Autowire来注入 SomeRepo 类,该类使用@Configurable和@Service进行注释。看来我使用 SomeRepo 的注入是错误的,因为它仍然使用相同的 TestWire 实例。您有任何示例或链接吗? -
您可以尝试对
@Configurable的工作原理进行一些研究,例如您需要启用方面编织。 -
@LuiggiMendoza,感谢您的信息。现在对我来说有点棘手,但我想,我很快就会回来详细审查)
标签: java spring dependency-injection spring-boot autowired