我很难理解重用某些代码的最佳策略是什么。通常,我在Spring中有控制器:
@Controller
public class PageX1{
@Autowired
HeaderService header;
@Autowired
CatalogService catalog;
@RequestMapping("/test1")
public String controller(Map<String, Object> model) {
setHeaderObjectsIntoModel(model, "a param");
setCatalogObjectsInyoModel(model, "another param", 1212, "more params");
}
private setHeaderObjectsIntoModel(Map<String, Object> model, String aParam){
Object value = header.getObjectWithParam(aParam);
model.put("key", value);
}
....
}
我可能需要在另一个控制器中重用与服务S1相关的部分,例如
@Controller
public class PageX2{
@Autowired
HeaderService s;
@RequestMapping("/test2")
public String controller(Map<String, Object> model) {
setHeaderObjectsIntoModel(model, "a new param");
}
}
和S2一样,一次又一次。
我不想重复代码。我脑子里有一些想法,但我认为没有什么好处(比如有一个用@Component
注释的类实现了一个旨在处理模型的接口,但我应该让参数通用,我想让它具体化尽量减少错误。)
什么是正确的方法? 任何例子都非常受欢迎
答案 0 :(得分:1)
您有两种选择。第一个选项是你可以有一个基本控制器,它提供了控制器继承的通用功能
public abstract class AbstractPage{
@Autowired
private HeaderService s;
protected Object retrieveObjectWithParam(String param){
return s.getObjectWithParam(param);
}
}
@Controller
public class PageX1 extends AbstractPage{
@RequestMapping("/test1")
public String controller(Map<String, Object> model) {
Object headerParam = retrieveObjectWithParam("a param");
model.put("key" , headerParam);
}
}
第二个选项是使用@ControllerAdvice注释类,为控制器提供通用模型属性
@ControllerAdvice
public class PageAdvice{
@Autowired
private HeaderService s;
@ModelAttribute("headerParam")
public Object retriveHeaderParm(){
return s.getObjectWithParam("a param");
}
}