【问题标题】:Spring MVC controller scope-issuesSpring MVC 控制器范围问题
【发布时间】:2013-10-23 16:36:48
【问题描述】:

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

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

【问题讨论】:

    标签: spring spring-mvc scope


    【解决方案1】:

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

    Must Spring MVC Classes be Thread-Safe

    Scope of a Spring-Controller and its instance-variables

    我从来没有找到任何理由考虑在我的控制器中使用成员变量。

    请注意,您的控制器通常应该是请求处理的薄包装器。然后应该将逻辑委托给服务,该服务反过来可能会调用存储库/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/

    【讨论】:

    • 这里也一样,我不知道控制器需要一个状态的明显情况。作为一个组件,它具有依赖关系。看到这样的案例真的很好奇。
    • 好的,谢谢你的解释......我不知道控制器只是一个包装器,你应该调用一个服务来完成所有的逻辑。看来我必须对服务和DAO层进行一些调查。
    • 也许我仍然误解了上面的代码,但是如果我在控制器中自动装配服务......不是每个请求都使用相同的服务实例吗?每个请求不应该是一个服务实例吗?
    • 你是对的。服务默认是一个单例,只要它是线程安全的就可以了。
    猜你喜欢
    • 2011-06-09
    • 1970-01-01
    • 2020-03-27
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多