2013-04-26 116 views
2

我配线类与Spring注释的帮助下接线春构造:通过注释

public class MyClass { 

    @Autowired 
    private B b ; 

    @Value("${foo}") 
    private String c ; 

    @Value("${bar}") 
    private Integer i ; 

    public MyClass (B b, String c, Integer i) { 
      this.b = b ; 
      this.c = c ; 
      this.i = i ; 
    } 
} 

我想从场中删除注释,并将其移动到构造函数:

public class MyClass { 

    private B b ; 

    private String c ; 

    private Integer i ; 

    @Autowired 
    public MyClass (B b, @Value("${foo}") String c, @Value("${bar}") Integer i) { 
      this.b = b ; 
      this.c = c ; 
      this.i = i ; 
    } 
} 

以上是做这件事的好方法吗?它使课堂变得更加美丽。有没有其他的方式来使用注释?

此外,这是否意味着b是Autowired,并且c和i通过@Value连线?也就是说,这里@Value注解的使用是否覆盖了c和i的@Autowired注解?

P.S. :我将注释放在构造函数中,因为我不想编写setters,只能测试这个类。所以我必须写一个带参数的构造函数,并给我一个包含所有字段的对象。 Spring的问题在于,如果我在字段上添加参数并编写一个带参数的构造函数,那么我也必须编写一个无参数构造函数,我不想这么做,因为这意味着在对这个类的测试,我可以调用no参数构造函数来创建一个对象,然后调用setter来设置字段。

回答

0

在这种情况下,我根本不使用自动装配,而是从bean定义中将参数注入构造函数。

public class MyClass { 
    private final B b ; 
    private final String c ; 
    private final Integer i ; 

    public MyClass (B b, String c, Integer i) { 
      this.b = b ; 
      this.c = c ; 
      this.i = i ; 
    } 
} 
+0

您必须通过xml或注释来完成。我想通过注释来完成。 – 2013-04-26 08:44:07

0

第一个例子,你不需要在构造函数中的参数(如果它在所有的作品)。这基本上是个人喜好的问题,但它确实有一定的影响:

  • 第二种方法比较容易在测试中使用(如果你没有在第一个例子构造函数的参数,而不诉诸以“反思黑客”)
  • 第二种方法确保当它不使用Spring

然而,有些情况下春天需要你的bean有一个默认的构造函数某些情况下,所有的成员被正确初始化它也使用前没有任何参数可以实例化你的bean,在这种情况下,你必须要我们第一种方法。通常,在使用AspectJ/AOP/Proxy时,会发生这种情况。我现在想不出一个具体的例子,但我遇到过几次。

就我个人而言,我总是尽可能使用第二种方法。