Spring MVC控制器范围问题

时间:2013-10-23 16:36:49

标签: spring spring-mvc scope

嘿,我是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"/>

你们如何实施控制器并使其“请求保存”?

1 个答案:

答案 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周围的大量锅炉板代码)。

http://fruzenshtein.com/spring-jpa-data-hibernate-mysql/