1

嘿,我是 Spring MVC 的新手,我需要一些建议/说明。目前我正在实现一个 MVC 应用程序,并且我正在为我的控制器的范围而苦苦挣扎。我扫描了我所有的控制器类 <context:component-scan base-package="controller"/> ,恕我直言,这是一种非常舒适的方式。

控制器(默认情况下或以上述方式扫描)是否正确,就像普通的 bean 一样?如果是这样,我的控制器的所有成员变量都在多个请求之间共享,对吗?我可以改变这个吗?我想要请求范围的控制器。就像:

<bean id="infoController" class="controller.InfoController" scope="request">
    <constructor-arg ref="sessionFactory"/>
</bean>

将我的控制器声明为 bean 是否有任何副作用?还是绝对不能这样宣布它们?或者甚至将它们声明为请求范围?我可以将这两种方式结合起来吗?就像是:

<context:component-scan base-package="controller" scope="request"/>

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

4

1 回答 1

3

请参阅以下内容以获得良好的摘要:

Spring MVC 类必须是线程安全的

Spring-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/

于 2013-10-23T20:02:36.867 回答