2012-07-20 74 views
0

我不知道,如果允許我問一個以上的問題在後,但在這裏它是,有關注釋和線程安全春初學者問題

例如,我有以下的,

控制器

@Controller 
public class FooController{ 

    @Autowired 
    private FooService fooService; 

    @RequestMapping(value="/foo", method=RequestMethod.POST) 
    public @ResponseBody foo(@RequestBody FooRequest request){ 
    } 

} 
@Controller 
public class BarController{ 

    @Autowired 
    private FooService fooService; 

    @RequestMapping(value="/bar", method=RequestMethod.POST) 
    public @ResponseBody bar(@RequestBody FooRequest request){ 
    } 

} 

服務

public class FooService{ 

    private Foo foo; 

    public Foo getFoo() { 
     return foo; 
    } 
    public void setFoo(Foo foo) { 
     this.foo = foo; 
    } 
    public String doFoo(String str){ 
     return foo.doFoo(str); 
    } 
} 

類做的工作

public class Foo{ 

    public String doFoo(String str){ 
     return (str + " is foo"); 
    } 
} 

使用依賴注入創造豆

<context:annotation-config/> 

<bean id="fooService" class="com.myapp.service.FooService"> 
    <property name="foo" ref="foo"></property> 
</bean> 
<bean id="foo" class="com.myapp.foo.Foo"> 
</bean> 

我的問題是:

  1. 我沒有FooService類使用@service註解,我應該使用它,並爲什麼
  2. 這個配置是否是線程安全的,而爲什麼(它是如何實現的,如果它是線程安全的)?
  3. 我在哪裏可以找到關於Spring設計中使用的圖層(dao圖層,服務圖層...)以及這種設計的目的的教程?

回答

1
  1. 使用它只會避免使用聲明XML豆的需求。您選擇使用其他豆的註釋。因此,我也會使用這個註解。
  2. 是的,因爲在提供任何請求之前,Spring確保所有內容都已正確連接並初始化,並且具有同步屏障
  3. 這是一個非常寬泛的問題。分層是用於關注,可測性,以聲明劃分事務能力分離是有用的,等等
+0

感謝您對bean對象或調用bean對象方法的快速回復,「同步障礙」? – user200340 2012-07-20 08:51:11

+0

在整個應用程序上下文中,AFAIK。 – 2012-07-20 08:53:25

+0

根據[SPR-8767](https://jira.springsource.org/browse/SPR-8767),AFAIK bean初始化是單線程的, – soulcheck 2012-07-20 09:07:34

4
  1. 您不必如果您在XML的配置聲明你的豆子,因爲你沒有使用註釋。
  2. 是。每個bean,儘管是一個單身,卻是無狀態的。所以不會發生併發修改。
  3. 例如在維基百科。這不是特定的春天。尋找篇關於three-tier architecture
+0

謝謝,我接受JB'answer,因爲我更喜歡他的同步屏障的答案。但三層鏈接非常有用。再次感謝。 – user200340 2012-07-20 09:06:59

1
  1. @Repository,@Service或@Controller(@Components子註釋)來標記特定的類,因此可以將它們視爲元數據或多或少。然而,Spring框架的一些特性可以利用這些特性。其中一個是自動組件掃描(一個給定的java包將被搜索具有上述註釋的類,這些類可以用作Spring bean,就好像它們是用XML聲明的一樣)。爲了實現這一點,你應該把這個變成你的Spring上下文:

    <context:component-scan base-package="my.service.package"/>

    更多內容可以在這裏找到:http://static.springsource.org/spring/docs/3.0.x/reference/beans.html#beans-classpath-scanning

    另一個用例是AOP。您可以創建註釋感知切入​​點,通過它可以選擇說出所有存儲庫類。

  2. 上下文中的Spring bean是一個接一個地提出來的,所以沒有併發踢入的機會。但是,Bean和Spring之間可能存在循環依賴關係,可能會或可能無法正確解決此問題。

  3. 對於DAO和服務的東西,當前的Spring 3文檔提供了很多示例,並且可能是學習的最佳來源:http://static.springsource.org/spring/docs/3.0.x/reference/index.html如果您希望獲得全面的知識,我建議嘗試JdbcTemplate,Rowmappers和一個基於ORM的Hibernate配置。