在MVC应用程序中,依赖注入将在何处进行?

mrb*_*lah 4 java spring spring-mvc

使用Spring和Spring的MVC时,应该在哪里进行依赖注入(DI)?

例如,如果您有控制器,并且控制器中有许多操作.

你会做的:

@RequestMapping("/blah")
public String SomeAction()
{
    ApplicationContext ctx = new AnnotationConfigApplicationContext();
    MyService myService = ctx.getBean("myService");

    // do something here

    return "someView";
}
Run Code Online (Sandbox Code Playgroud)

这是最好的做法吗?或者他们是更好的方式?

Pas*_*ent 10

依赖注入的整个想法是不让你的类知道或关心他们如何获得他们依赖的对象.通过注入,这些依赖关系应该"出现"而没有任何请求(因此控制反转).使用时ApplicationContext#getBean(String),您仍然要求依赖(服务定位器),这不是控制反转(即使这允许您轻松更改实现).

因此,相反,您应该MyController使用Spring托管bean并MyService使用基于setter或构造函数的注入进行注入.

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";
    }
}
Run Code Online (Sandbox Code Playgroud)

并配置Spring将事物连接在一起.

  • 我认为对于Spring MVC的新手来说,理解你的控制器已经被ApplicationContext加载和连接是很重要的.因此,您需要做的就是指定控制器应该连接哪些其他bean. (4认同)