2013-10-23 149 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