我正在研究三种不同的表格。我正在使用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的类中的其他方法?
答案 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注释。