如何在Spring Beans中使用多态?

时间:2011-04-15 07:44:42

标签: spring polymorphism javabeans

这是我正在做的事情的前提:
- 使用简单的servlet获取页面请求 - 从请求中获取页面ID以确定我所在的页面 - 在bean xml配置中定义控制器 - 使用bean定义来确定要使用的页面控制器类。 - 所有这些页面控制器都扩展了CORE.Controllers.PageController类。

这是我想要做的,但失败了。我正在尝试将页面控制器类(PersonController,由bean确定)加载到PageController变量中。您将在我的代码示例中看到的是我将它转换为PageController类。这不起作用。

如何使用多态性将我的PersonController对象从bean工厂中获取到我的变量中?

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans.xsd">

<!-- -->
<bean id="home" name="home" class="CORE.Controllers.HomeController" />
<bean id="person" name="person" class="CORE.Controllers.PersonController" />

<!-- Property Management -->
<bean id="propertyEvaluator" class="CORE.Controllers.PropertyManagement.PropertyEvaluator" />
</beans>

课程在这里:

String pageId = "home";
    if (request.getParameter("PID") != null)
    {
        pageId = request.getParameter("PID");
    }

    response.setContentType("text/html; charset=UTF-8"); // Set content type for HTML.
    PrintWriter out = response.getWriter(); // Output goes to the response PrintWriter.
    try
    {
        TransformerFactory tFactory = TransformerFactory.newInstance();
        String ctx = getServletContext().getRealPath("") + FS; //get the real path for xml and xsl files.

        BeanFactory pageFactory = new XmlBeanFactory(new FileSystemResource(ctx+"WEB-INF/page-cfg.xml"));
        PageMapping pageMap = (PageMapping) pageFactory.getBean("pageMapping");
        Page page = pageMap.getPageById(pageId);

        BeanFactory controllerFactory = new XmlBeanFactory(new FileSystemResource(ctx+"WEB-INF/controller-cfg.xml"));
        PageController controller = (PageController) controllerFactory.getBean(page.getControllerName());
        controller.setRequest(request);

2 个答案:

答案 0 :(得分:1)

感谢您的更新。我想我现在明白了 - 你想避免演员表演PageController

替换

PageController controller = (PageController)controllerFactory
    .getBean(page.getControllerName());

PageController controller = controllerFactory
    .getBean(page.getControllerName(), PageController.class);

Spring允许您使用期望bean的类型来参数化getBean调用。在“引擎盖下”的实施方面,它仍然是一个演员,如果命名的bean与所请求的类型不对应,你将获得ClassCastException,但至少现在编译器通过泛型来处理它。

答案 1 :(得分:0)

在Spring中,如果我们使用JDK代理(如下面更正的@mdma),我们不能将对象强制转换为具体的类实例,我们只能将它转换为接口实例。在这种情况下,您需要将PageController更改为一个接口并为其创建一个实现,名为PageControllerImpl并在您的controller-cfg.xml中声明它。

如果使用CGLIB,您的代码可能没问题。