Spring变量名自动装配

时间:2014-01-20 08:45:03

标签: spring-mvc architecture autowired spring-el

以下是我的控制器。我的程序根据表单输入生成输出。在整个项目中,有多个输入表单,用于生成输出对象。所以,基本流程是一样的。所以我想要一个能完成所有这一切的多动作控制器。

挑战:  1.服务类别发生变化。虽然所有服务都实现相同的接口,但控制器调用相同的接口方法。  2.输入对象发生变化。虽然输入对象除了setter和getter之外没有任何方法。所以我让他们都实现了一个空接口。

问题:

  1. 如何根据路径更改限定符。我可以使用路径变量吗?

  2. 假设路径具有此值 - >单身。然后我的相应bean名称将是singletonService和singletonInput。我想创建一个存储此映射信息的常量类。那么,我可以使用一些Spring Expression Language从限定符内部调用它吗?示例,而不是限定符(variablePathName) - >限定符(getQualifierName ['variablePathName'])类似的东西?

  3. 请澄清这背后的理论。根据我的理解,在映射请求之前创建,自动装配bean ...这是否意味着我在这里尝试实现的是根本不可能的。在这种情况下,您是否建议使用Controller-service对来处理每个请求,基本相同的代码?但我觉得必须有某种方法来实现我正在努力的目标......

  4. 代码:

    @Cotroller
    @RequestMapping(value="/generate/{path}")
    public class TestController {
    
        @Autowired
        @Qualifier(......)
        private IService service;
    
        @Autowired
        @Qualifier(......)
        IUserInput userInput;
    
        @RequestMapping(method = RequestMethod.POST)
        //Some handler method
    }
    

1 个答案:

答案 0 :(得分:2)

你是对的,因为自动装配一切都在前面完成(第3点)。使用带注释的字段@Autowired@Qualifier,您将无法实现所需的功能 - 因为这些字段始终引用相同的bean实例。

根据路径变量,您可能更好地按名称​​向Spring 询问特定服务bean。您可以在单个控制器实例中执行此操作。例如:

@Cotroller
@RequestMapping(value="/generate/{path}")
public class TestController {

    @Autowired
    private ApplicationContext applicationContext;

    @RequestMapping(method = RequestMethod.POST)
    public String someHandlerMethod(@PathVariable String path) {
        IService service = (IService) applicationContext.getBean(path + "Service");
        IUserInput userInput = (IUserInput) applicationContext.getBean(path + "UserInput");

        // Logic using path specific IService and IUserInput
    }
}