嘿,我是Spring MVC的新手,我需要一些建议/澄清。
目前我正在实现一个MVC应用程序,我正在努力控制我的控制器范围。
我通过扫描所有控制器类
<context:component-scan base-package="controller"/>
这是恕我直言,非常舒适。
是否正确,控制器(默认情况下或以上述方式扫描)是单个就像普通的bean一样?如果是这样,我的控制器的所有成员变量都在几个请求之间共享对吗?我可以改变吗?我想要请求范围的控制器。就像:
<bean id="infoController" class="controller.InfoController" scope="request">
<constructor-arg ref="sessionFactory"/>
</bean>
将控制器声明为豆类是否有任何副作用?或者绝对没有声明他们是这样的?或者甚至将它们声明为请求范围? 我可以将两种方式结合起来吗?类似的东西:
<context:component-scan base-package="controller" scope="request"/>
你们如何实施控制器并使其“请求保存”?
答案 0 :(得分:2)
请参阅以下内容以获得一个很好的总结:
Must Spring MVC Classes be Thread-Safe
Scope of a Spring-Controller and its instance-variables
我从来没有找到任何理由考虑在我的控制器中使用成员变量。
请注意,您的Controller通常应该是请求处理的瘦包装器。然后应该将逻辑委托给服务,而服务又可以调用存储库/ DAO。然后,您应该避免将会话工厂直接传递给控制器,并在服务层定义事务。
@Controller
public class MyController{
@Autowired
private MyService service;
public String handlePost(){
service.saveEntity(...);
return "success";
}
}
@Service
public class MyService{
@Autowired
private MyRepository repository;
@Transactional
public void saveEntity(Entity e){
repository.save(e);
}
}
@Repository
public class MyRepository{
public void save(Entity e){
.....
}
}
请参阅此处获取示例(也使用Spring Data减少了JPA / Hibernate周围的大量锅炉板代码)。