【问题标题】:Wiring Spring constructor through annotations通过注解连接 Spring 构造函数
【发布时间】:2013-04-20 08:36:41
【问题描述】:

我在 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注解吗?

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

【问题讨论】:

    标签: java spring spring-mvc annotations


    【解决方案1】:

    在这种情况下,我根本不会使用自动装配,而是将 args 从 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 ;
        }
    }
    

    【讨论】:

    • 您必须通过 xml 或注释来完成。我想通过注解来实现。
    【解决方案2】:

    对于第一个示例,您不需要构造函数中的参数(如果它确实有效)。这基本上是个人喜好问题,但它确实有一些含义:

    • 第二种方法更易于在测试中使用(如果您不必在第一个示例中的构造函数中设置参数,并且无需诉诸“反射技巧”)
    • 第二种方法确保在使用之前正确初始化所有字段,即使在没有 Spring 的情况下使用也是如此

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-29
      • 2012-11-23
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      相关资源
      最近更新 更多