在Spring 3中通过注释注入与通过XML文件注入3.与继承相关的限制

时间:2010-12-01 18:10:49

标签: java spring inheritance dependency-injection

我有以下抽象类,其中一个名为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);
    }
}

我不喜欢上一个选项,如果要达到通过注释取决于具体类注入一个或另一个值的目的,这将是最优雅的选项?

我知道继承和注释有时会发生冲突。

非常感谢。

2 个答案:

答案 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()'方法获取视图名称。

相关问题