/ / Spring MVC 3.0 - Сервизен слой, използващ анонации - пружина, модел-изглед-контролер, spring-mvc, анотации, инверсия на контрол

Пролет MVC 3.0 - Сервизен слой, който използва анонации - пружина, модел-view-controller, spring-mvc, анотации, инверсия на контрол

В пролетното ми MVC приложение с един клас контролер,

@Controller
public class MyController {
@RequestMapping(method = RequestMethod.POST, value = "/*.htm")
public myMethod{@RequestBody final MyRequestBean myRequest}

}

Моят принос е във формата на JSON и използвам Джаксън за превръщането му в Java обект. Сега, въз основа на собствеността в обекта на Java, искам да изпратя на съответния сервизен клас. Ако е,

myRequest.value == "1" -> FirstService
myRequest.value == "2" -> SecondService

Всички тези сервизни класове ще изпълняват aосновен интерфейс. Не искам да правя тази инстанция в моя Java код. Как мога да преместя това в конфигурационен файл. Как мога да инжектирам тези обекти динамично въз основа на стойностите на заявката. Моля, имайте предвид, че използвам пояснения. Аз съм нов за spring.Please съветвам

EDIT: Да включа моето решение
В моя dispatcher.xml,

`<util:map id="myMap">
<entry key="service1" value="com.service.MyService1" />
<entry key="service2" value="com.service.MyService1" />
</util:map>`

В моя контролер,

@Resource private Map myMap;

и в метода вътре в контролера,
MyService myService = (MyService) Class.forName((String)myMap.get(myRequest.getValue())).newInstance(); System.out.println("My value" + myService.doService());

Както може да се види, са използвали Java отражение за получаване на инстанция от низа, върната от моя XML. Това ли е правилният начин?

Отговори:

3 за отговор № 1
  1. Създайте FactoryBean, който създава един от всички възможни случаи
  2. Използвайте държавния държач на конеца RequestAttributes за да получи искането
  3. Направете контролера на @Scope("request")
  4. Инжектирайте услугата чрез интерфейс

Това трябва да улесни контролера. Но това е грозен подход. Ето още един:

  1. Инжектирайте a List<YourInterface>
  2. Определете метод в интерфейса getImplementationId()
  3. За всяко искане повторете списъка и изберете инструмента, който връща правилното идентификатор

Вариант на това би бил или:

  • препоплетете карта с ключ - ключът, идващ от json, и стойност - специфичен IMPL
  • Включете копчето jsod в името на зърното за внедряване и инжектирайте a Map<String, YourInterface>

След това търсете с ключ