2

我是通过 Google Guice 进入国际奥委会的。

现在我被迫在工作中使用 Spring 2.5.6 并且我迷失了,因为 Spring 相当复杂。在阅读了一些 spring 文档后,这里有一些问题:

  • @Service@Controller和有什么区别@Component?如果我只想像 Guice 这样自动连接我的对象,我需要被所有这些刻板印象所困扰吗?
  • 我打算只使用构造函数注入(Setter 注入主要由山达基教会提倡)并且没有可怕的 XML 东西来使用组件扫描路线。那么这段代码是否提取了我所需要的全部内容?

    @Component
    public class Foo
    {
        @Autowired(required=true)
        public Foo( Bar bar, @Qualifier("yay") Boo yay, 
                    @Qualifier("hoo") Boo hoo )
        {
            _bar = bar; _boo = boo;
        }
    
        Bar _bar;
        Boo _boo;
    ....snipped...
    }
    
    @Component
    @Qualifier("yay")
    @Scope(BeanDefinition.SCOPE_PROTOTYPE)
    public BooYay implements Boo
    {
    }
    
    @Component
    @Qualifier("hoo")
    @Scope(BeanDefinition.SCOPE_PROTOTYPE)
    public BooHoo implements Boo
    {
    }
    
    • 在上面的示例中,我是否正确限定了 2 个不同的实现Boo
    • 有没有类似于 Google Guice 的 Providers 的功能?
    • 我如何模仿@SingletonSpring 中的行为(在 Guice 中)?
4

1 回答 1

4

查看您的代码,似乎一切正常,您的组件将获得autowired. 您必须在 XML 配置文件中提供您的包名称,以便 Spring 可以扫描它以查找注释。

一般来说,Spring 管理的组件,自动检测组件的默认和最常见的范围是单例。

实际上,@Component 是@Service 和@Controller 的泛化。请参阅文档

Spring 2.5 引入了更多的原型注解:@Component、@Service 和@Controller。@Component 充当任何 Spring 管理的组件的通用构造型;而@Repository、@Service 和@Controller 作为@Component 的特化,用于更具体的用例(例如,分别在持久层、服务层和表示层中)。这意味着您可以使用@Component 注释您的组件类,但是通过使用@Repository、@Service 或@Controller 注释它们,您的类更适合工具处理或与方面关联。例如,这些原型注释是切入点的理想目标。当然也有可能@Repository、@Service、@Controller 可能会在 Spring Framework 的未来版本中携带额外的语义。因此,如果您在为服务层使用@Component 或@Service 之间做出决定,@Service 显然是更好的选择。同样,如上所述,@Repository 已被支持作为持久层中自动异常转换的标记。

确保这些 bean 的default-autowireorautowire值是byType. 然后你应该修改你的 Boo 组件,如下所示,

@Component("yay")
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public BooYay implements Boo
{...}


@Component("hoo")
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public BooHoo implements Boo
{...}

您可能希望使用 来执行此操作autowire = "byName",在这种情况下,您将不需要@Qualifiers,但必须提供匹配的设置器。我希望你现在能把事情搞定。

于 2009-11-18T02:52:02.767 回答