通过注释连接Spring构造函数

时间:2013-04-26 08:25:59

标签: java spring spring-mvc annotations

我在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是自动装配的,而c和i是通过@Value连接的?也就是说,这里使用@Value注释是否会覆盖c和i的@Autowired注释?

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

2 个答案:

答案 0 :(得分:0)

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

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 ;
    }
}

答案 1 :(得分:0)

使用第一个示例,您不需要构造函数中的参数(如果它完全有效)。这基本上是个人偏好的问题,但确实有一些影响:

  • 第二种方法在测试中更容易使用(如果在第一个示例中没有构造函数中的参数,并且没有求助于“反射黑客”)
  • 第二种方法确保所有字段在使用之前都已正确初始化,而且在没有Spring的情况下使用它

但是,在某些情况下,Spring要求你的bean有一个没有参数的默认构造函数,以便能够实例化你的bean,在这种情况下,你必须使用第一种方法。通常,在您使用AspectJ / AOP / Proxy时会出现这种情况。我现在想不出一个具体的例子,但我已经遇到过几次了。

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