Java 在MVC应用程序中,依赖项注入将发生在哪里?
当使用和Spring的MVC时,(DI)应该发生在哪里 例如,如果您有一个控制器,并且控制器中有许多操作 您是否会:Java 在MVC应用程序中,依赖项注入将发生在哪里?,java,spring,spring-mvc,Java,Spring,Spring Mvc,当使用和Spring的MVC时,(DI)应该发生在哪里 例如,如果您有一个控制器,并且控制器中有许多操作 您是否会: @RequestMapping("/blah") public String SomeAction() { ApplicationContext ctx = new AnnotationConfigApplicationContext(); MyService myService = ctx.getBean("myService"); // do som
@RequestMapping("/blah")
public String SomeAction()
{
ApplicationContext ctx = new AnnotationConfigApplicationContext();
MyService myService = ctx.getBean("myService");
// do something here
return "someView";
}
这是最佳实践方法吗?还是他们的方法更好?不要使用getbean,这样就失去了进行DI的目的。改用@Autowired。DI用于视图、服务等分层系统,因此每一层都不相互依赖。依赖注入的整个思想是不让类知道或关心它们如何获得所依赖的对象。通过注入,这些依赖关系应该只是“出现”,而不需要任何请求(因此控制权倒置)。当使用
ApplicationContext#getBean(String)
时,您仍然需要依赖项(la服务定位器),这不是控制反转(即使这允许您轻松更改实现)
因此,相反,您应该使您的MyController
成为Spring管理的bean,并使用setter或基于构造函数的注入来注入MyService
public class MyController {
private MyService myService;
public MyController(MyService aService) { // constructor based injection
this.myService = aService;
}
public void setMyService(MySerice aService) { // setter based injection
this.myService = aService;
}
@Autowired
public void setMyService(MyService aService) { // autowired by Spring
this.myService = aService;
}
@RequestMapping("/blah")
public String someAction()
{
// do something here
myService.foo();
return "someView";
}
}
并将Spring配置为将事物连接在一起。作为对Pascal帖子的一种补充, 这是一本必读的书
正如Cometa所说,您应该使用
@Autowire
注释来实现这一点。除此之外,Spring还支持基于名称和基于类型的约定注入。我建议你读一读。没有Cometa,你仍然可以用DI把事情弄得乱七八糟,也就是说,建立不适当的依赖关系。不过,您的建议是正确的。当使用getBean方法时,它听起来像是服务定位器模式,而不是依赖注入。不要打电话给我们(applicationContext.getBean),我们会打电话给你。真的——一个他不接受任何答案的愚蠢问题?令人震惊的是,我告诉你。我认为对于Spring MVC的新手来说,理解你的控制器已经被一个ApplicationContext加载和连接是很重要的。因此,您所需要做的就是指定控制器应该与哪些其他bean连接。您可以将@controller添加到上面的类的前面,以帮助Spring加载它,特别是如果您使用它,那么任何连接的bean都会像:AnyBlah blah=new AnyBlah()?@mrblah:试试看,试试看。同时,我们为你的下一个问题准备了答案。干杯