假定弹簧控制器参数是实例化的,但是当它在何处进行实例化



百里叶教程代码

这个种子故事是如何实例化的?看到该方法的主体显示与对象种子阶层的相互作用。

由于该项目是一个教程,因此我将摘录我寻找答案的确切位置。我目前尚不知道可以创建此"访客"对象的其他任何方法,而不是以下情况:1.以前是创建并添加到模型中的。(在其他地方,控制器中没有INIT可能不会添加到模型中(2.已经创建的控制器的私人成员。

@RequestMapping({"/","/seedstartermng"})
    public String showSeedstarters(final SeedStarter seedStarter) {
        seedStarter.setDatePlanted(Calendar.getInstance().getTime());
        return "seedstartermng";
    }

控制器:

@Controller
public class SeedStarterMngController {

    @Autowired
    private VarietyService varietyService;
    @Autowired
    private SeedStarterService seedStarterService;

    public SeedStarterMngController() {
        super();
    }

    @ModelAttribute("allTypes")
    public List<Type> populateTypes() {
        return Arrays.asList(Type.ALL);
    }
    @ModelAttribute("allFeatures")
    public List<Feature> populateFeatures() {
        return Arrays.asList(Feature.ALL);
    }
    @ModelAttribute("allVarieties")
    public List<Variety> populateVarieties() {
        return this.varietyService.findAll();
    }
    @ModelAttribute("allSeedStarters")
    public List<SeedStarter> populateSeedStarters() {
        return this.seedStarterService.findAll();
    }

    @RequestMapping({"/","/seedstartermng"})
    public String showSeedstarters(final SeedStarter seedStarter) {
        seedStarter.setDatePlanted(Calendar.getInstance().getTime());
        return "seedstartermng";
    }

Spring MVC成功匹配控制器方法,并且在实际调用它之前,它将基于参数类型及其注释来解决方法参数。您可以从此表中找到所有受支持的类型,注释和解决规则。

在您的情况下,由于 SeedStarter没有任何注释,其类型不是受支持的类型,因此默认情况下会返回到默认情况下,就好像 @ModelAttribute在上面注释了。(该表中的最后一个规则提到(。从@ModelAttribute文档中,它将实例化SeedStarter如下:

  • 如果已经使用模型添加了模型。
  • 通过使用@SessionAttributes,来自HTTP会话。
  • 来自URI路径变量通过 转换器(请参阅下一个示例(。
  • 从默认的调用中 构造函数。
  • 来自与"主要构造函数"的调用 与Servlet请求参数匹配的参数。参数名称为 通过javabeans @constructorproperties或通过 字节码中的运行时保留参数名称。

最新更新