我有以下抽象类,其中一个名为portletBaseViewName
的属性对于扩展AbstractController
的每个具体Controller都是不同的。
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);
}
}
我不喜欢上一个选项,如果要达到通过注释取决于具体类注入一个或另一个值的目的,这将是最优雅的选项?
我知道继承和注释有时会发生冲突。
非常感谢。
答案 0 :(得分:1)
你真的需要@Value
吗?
@Value
在包含Spring在运行时评估的一些表达式时非常有用。否则,您可以使用显式初始化替换它(并保持setter方法允许您从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";
}
}
答案 1 :(得分:0)
如前面的答案中@axtavt所示,AbstractController
中不需要任何注释。此外,您不需要在XML中定义abstractController。如果您想在其所有子类中配置公共属性,可以将它们放在abstract 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()'方法获取视图名称。