Внедрение через аннотации против внедрения через XML-файл в Spring 3. Ограничения, связанные с наследованием - PullRequest
2 голосов
/ 01 декабря 2010

У меня есть следующий абстрактный класс со свойством под названием portletBaseViewName, которое должно быть разным для каждого конкретного контроллера, расширяющего AbstractController.

public abstract class AbstractController {

    private String portletBaseViewName;

    protected String getPortletBaseViewName() {
        return portletBaseViewName;
    }

    @Required
    @Value("")
    public void setPortletBaseViewName(String portletBaseViewName) {
        this.portletBaseViewName = portletBaseViewName;
    }

}

@Controller
@RequestMapping("VIEW")
public class ReservationOfBooksViewController extends AbstractController{}

Я знаю, что возможно объявить инъекцииXML, при этом:

<bean id="abstractController" class="es.alcampo.portalweb.portlets.common.controller.AbstractController" abstract="true">
    <property name="portletBaseViewName" value="" />
</bean>

<bean id="reservationOfBooksViewController" class="es.example.portalweb.portlets.reservationofbooks.controller.ReservationOfBooksViewController" parent="abstractController">
    <property name="portletBaseViewName" value="reservationOfBooks" />
</bean>

<bean id="myShopViewController" class="es.example.portalweb.portlets.reservationofbooks.controller.MyShopViewController" parent="abstractController">
    <property name="portletBaseViewName" value="myShop" />
</bean>

Нужно ли переопределять?:

@Controller
@RequestMapping("VIEW")
public class ReservationOfBooksViewController extends AbstractController{
    @Value("reservationOfBooks")
    public void setPortletBaseViewName(String portletBaseViewName) {
        super.setPortletBaseViewName(portletBaseViewName);
    }
}

Мне не нравится предыдущий вариант, который был бы наиболее элегантным, если естьдостичь цели внедрения того или иного значения в зависимости от конкретного класса с помощью аннотаций?

Я знаю, что наследование и аннотации иногда конфликтуют.

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 01 декабря 2010

Вам действительно нужно @Value здесь?

@Value полезно, когда оно содержит некоторые выражения, вычисленные Spring во время выполнения. В противном случае вы можете заменить его явной инициализацией (и сохранение метода установки позволяет переопределить эти значения из конфигурации XML):

public abstract class AbstractController { 
    protected String portletBaseViewName = "";      

    public void setPortletBaseViewName(String portletBaseViewName) { 
        this.portletBaseViewName = portletBaseViewName; 
    } 
} 

@Controller  
@RequestMapping("VIEW")  
public class ReservationOfBooksViewController extends AbstractController{  
    public ReservationOfBooksViewController() {
        this.portletBaseViewName = "reservationOfBooks";
    }
}
0 голосов
/ 05 декабря 2010

Как показывает @axtavt в предыдущем ответе, вам не нужно никаких комментариев в AbstractController. Кроме того, вам не нужно определять abstractController в XML. Если вы хотите настроить общие свойства во всех его подклассах, вы можете поместить их в абстрактный bean-компонент (без имени класса):

<!-- define common properties in abstract bean-->
<bean id="controllerTemplate" abstract="true" />



<bean id="reservationOfBooksViewController" class="es.example.portalweb.portlets.reservationofbooks.controller.ReservationOfBooksViewController" parent="controllerTemplate">
<property name="portletBaseViewName" value="reservationOfBooks" />

В подклассах аннотация @Value не требуется, и вы можете использовать метод getPortletBaseViewName () для получения имени представления.

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