在没有RequestMapping的类中自动装配

时间:2013-07-29 08:58:29

标签: java hibernate java-ee spring-mvc autowired

我正在研究三种不同的表格。我正在使用Hibernate查询这些表。我成功实现了DAO和服务层,但我对控制器包的问题很少。这是我的代码,我的控制器包包含3个类,每个类应该处理一个表(我之前说的有3个表)。

@Controller
public class Ods_Gis_Actel_Controller {

    Param_Gis_Actel_Controller Param = new Param_Gis_Actel_Controller();
    Tbl_Dim_Actel_Controller Dim = new Tbl_Dim_Actel_Controller();


    @Autowired
    Ods_Gis_Actel_metier service;

    @RequestMapping(value="/index")
    public String pageIndex(Model model)
    {   
        addOdsTable(model);
        Param.addParamTable(model);
        Dim.addDimTable(model);
        return "Affichage";
    }

    public void addOdsTable(Model model)
    {
        model.addAttribute("listeOds",service.getAll());
    }

}

@Controller
public class Param_Gis_Actel_Controller {

    @Autowired
    Param_Gis_Actel_metier service;

    public void addParamTable(Model model)
    { 
    model.addAttribute("listeParam",service.getAll());
    }

}




@Controller
public class Tbl_Dim_Actel_Controller {

    @Autowired
    Tbl_Dim_Actel_metier service;

    public void addDimTable(Model model)
    {
    model.addAttribute("listeDim",service.getAll());
    }

}

请求映射在第一个类中完成,其方法从其他类调用另外两个方法。但似乎自动装配仅适用于执行RequestMapping的类。

这是真的吗?

如果自动装配对他们不起作用,我如何使用不包含RequestMapping的类中的其他方法?

3 个答案:

答案 0 :(得分:1)

我经历了你的问题,我认为你并不太了解@Controller的目标,@ RequestMapping。首先,您需要知道,为什么我们使用@Controller ?,这用于为您的请求提供业务逻辑。当从用户点击请求时,您的DispatcherServlet会将您请求中的url与所有已定义控制器的RequestMapping注释值相匹配。并据此,调用匹配的映射方法,并通过框架完成进一步的过程。现在来到@Autowire,这用于从xml配置加载bean类定义。所以@Autowire和@RequestMapping有不同的目标。

这里说错了

**autowiring** works only in the class where the RequestMapping is performed.

现在你的第二个问题,你如何使用简单的课程?据我所知,有两种方法可以实现这一点, 1)像在代码中一样在类中创建该类的Object 2)使用factory-method创建该类的实例。

对于第二点,您必须首先按照以下格式在配置文件中定义您的类

<bean id="paramGis" class="<whatever_package_detail>.Param_Gis_Actel_Controller" factory-method="createInstance"/>

这里有一件事需要注意,这个方法应该是静态的。

你的班级看起来像那样

@Service
public class Param_Gis_Actel_Controller {


    private static Param_Gis_Actel_Controller  paramGis;

    public static Param_Gis_Actel_Controller createInstance(){
                 if(paramGis==null){
                       return new Param_Gis_Actel_Controller();
                 }
         return paramGis;
    }

    public void addParamTable(Model model)
    { 
    model.addAttribute("listeParam",service.getAll());
    }

}

如果您仍然遇到问题请告诉我。

答案 1 :(得分:0)

我认为你在Java / Spring方面遇到了困难。我们不会那样使用@Controller/@Autowired

很快就很难解释(我强烈建议你阅读official document),但简而言之,你不应该在另一个控制器中创建一个Controller对象。具有注释标记(@Controller@Service ...)的对象应由Spring生成和管理。在启动时,他们将通过“Spring”方式注入@Autowired服务。在课程中,您可以通过其他特殊方法干预该过程。

P / s:您的命名约定不适用于Java;)。如果您创建一个供个人使用的程序,它可能没问题,但您将很难与其他Java开发人员合作。

答案 2 :(得分:0)

通过方法名称作为默认方式访问该特定方法或使用@Qualifier注释。