В приложении MVC, где произойдет внедрение зависимости? - PullRequest
4 голосов
/ 26 января 2010

При использовании Spring и Spring MVC, где должно происходить внедрение зависимости (DI)?

Пример, если у вас есть контроллер и много действий в контроллере.

Будете ли вы делать:

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

    // do something here

    return "someView";
}

Будет ли это наилучшим практическим подходом? Или их лучше?

Ответы [ 3 ]

10 голосов
/ 26 января 2010

Вся идея внедрения зависимостей состоит в том, чтобы не чтобы ваши классы знали или заботились о том, как они получают объекты, от которых зависят. При внедрении эти зависимости должны просто «появляться» без какого-либо запроса (отсюда и инверсия контроля). При использовании ApplicationContext#getBean(String) вы по-прежнему запрашиваете зависимость (а-ля Service Locator), а это , а не Инверсия управления (даже если это позволяет легко изменять реализацию).

Таким образом, вместо этого вы должны сделать ваш MyController управляемым компонентом Spring и внедрить 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 для соединения вещей.

2 голосов
/ 26 января 2010

Не используйте getbean, которое теряет цель делать DI. Вместо этого используйте @Autowired. DI предназначен для использования в многоуровневой системе, такой как view, service, DAO , так что каждый слой не зависит друг от друга.

1 голос
/ 26 января 2010

В качестве комплимента к посту Паскаля, Мартин Фаулер: инверсия управляющих контейнеров и шаблон внедрения зависимостей необходимо прочитать.

И, как указала комета, вы должны использовать аннотацию @Autowire для достижения этой цели. В дополнение к этому, Spring поддерживает внедрение соглашений на основе имен и типов. Я предлагаю вам прочитать об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...