2012-07-20 75 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配置。