Spring初学者关于注释和线程安全的问题

时间:2012-07-20 08:22:28

标签: spring spring-mvc

我不确定我是否可以在帖子中提出多个问题,但现在是,

例如我有以下内容,

控制器

@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");
    }
}

使用依赖注入创建bean

<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. 我没有在课程@service上使用FooService注释,我应该使用它吗?为什么
  2. 这个配置是否是线程安全的,为什么(如果它是线程安全的,它是如何实现的)?
  3. 我在哪里可以找到有关Spring设计中使用的图层(dao图层,服务图层......)的教程以及此类设计的目的?

3 个答案:

答案 0 :(得分:4)

  1. 如果您像在xml-config中一样声明bean,则不必使用注释。
  2. 是的。每个豆子虽然是单身,但却是无国籍的。因此不会发生并发修改。
  3. 例如在维基百科中。这不是特定于春天的。查找有关three-tier architecture
  4. 的文章

答案 1 :(得分:1)

  1. 使用它只会避免使用XML声明bean的需要。您选择为其他bean使用注释。因此我也会使用这个注释。
  2. 是的,是的,因为Spring在提供任何请求之前确保所有内容都已正确连接和初始化,同步屏障
  3. 这是一个非常广泛的问题。分层对于分离关注点,可测试性,以声明方式划分事务的能力等非常有用。

答案 2 :(得分:1)

  1. @ Repository,@ Service或@Controller(@Components的子注释)用于标记特定的类,因此可以将它们或多或少地视为元数据。但是,Spring框架的一些功能可以利用这些功能。其中之一是自动组件扫描(将使用上述注释搜索给定的Java包,这些类可以用作Spring bean,就好像它们是用XML声明的一样)。要启用此功能,您应该将其放入弹簧上下文中:

    <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如果您想获得全面的知识,我建议使用Hibernate尝试JdbcTemplate,Rowmappers和基于ORM的配置。