2013-10-23 147 views
1

嘿,我是Spring MVC的新手,我需要一些建议/澄清。 目前我正在实现一个MVC应用程序,我正在努力处理我的控制器的范围。 我扫描我的所有控制器类通过 <context:component-scan base-package="controller"/> 这是恕我直言一个非常舒适的方式。Spring MVC控制器范围问题

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

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

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

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

你们是如何实现你的控制器,并使他们“请求保存”?

回答

2

见一个很好的总结如下:

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){ 
    ..... 
    } 

} 

查看这里的一个例子(也使用春季数据,减少JPA /休眠周围大量的锅炉板代码)。

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

+0

同样在这里,我知道其中一个控制器将需要有一个状态没有明显的情况下。作为一个组件它有依赖关系。看到这样的情况真的很好奇。 – mwhs

+0

好的,谢谢你的解释......我没有意识到控制器只是一个包装,你应该调用一个服务来完成所有的逻辑。好像我必须对服务和DAO层进行一些调查。 – coR

+0

也许我仍然想念上面的代码,但是如果我在控制器中自动装载服务......是不是每个请求都是同一个服务实例?它不应该是每个请求的一个服务实例吗? – coR