我做了很多事情来找到我的问题,但我不能抱歉如果这个问题已经在堆栈上溢出,因为我还没有找到它。
首先让我们来看看代码
@Controller
public class Controller1 {
@RequestMapping(value = "URL", method = RequestMethod.GET)
public ModelAndView methodHandler(Parameters) {
}
public int calculation(int i){
//Some Calcucation
return i;
}
}
和第二个控制器是
@Controller
public class Controller2 {
@RequestMapping(value = "URL", method = RequestMethod.GET)
public ModelAndView methodHandler(Parameters) {
//In this I want to call the calculation(1) method of controller1.
}
}
我的问题是,有没有办法将controler1的calculate()方法调用到controller2中。但请记住,我不想在controller1中使方法静态。无论如何调用它而不使其静态?
由于 亚西尔
答案 0 :(得分:1)
你的控制器不应该互相打电话。如果两个控制器都需要使用某个逻辑,那么将它放入单独的bean中会好得多,这将由两个控制器使用。然后你可以简单地将那个bean注入到必要的控制器中。尽量不要将任何业务逻辑放到控制器上,尝试将其放到专门的类中,如果可能的话,它将是Web独立的,并且将接受与Web无关的业务数据,如用户电子邮件,帐号等。没有http请求或响应。这样,具有实际逻辑的类可以重复使用,并且可以更容易地进行单元测试。此外,如果有状态,它应该包含在控制器外的类中。控制器应该是无状态的,根本不包含任何状态。
当使用MVC模式并且您决定将逻辑放在何处时,您应该将业务逻辑分为模型和控制器,您应该只放置有关用户交互的逻辑as explained in this stack overflow post。
答案 1 :(得分:1)
您应该在配置文件中创建服务bean(或使用其中一个注释)并将其注入控制器。例如()
@Configuration
public class MyConfig {
@Bean
public MyService myService(){
return new MyService();
}
}
@Controller
public class Controller1 {
@Autowire
private MyService myService;
@RequestMapping(value = "URL", method = RequestMethod.GET)
public ModelAndView First(Parameters) {
myService.calculation();
}
}
@Controller
public class Controller2 {
@Autowire
private MyBean myBean;
@RequestMapping(value = "URL", method = RequestMethod.GET)
public ModelAndView First(Parameters) {
myService.calculation();
}
}