Spring Inject接口实现

时间:2018-11-06 06:04:51

标签: java spring dependency-injection interface

我想使用lombok注入从如下所示的接口实现的类:

@RequiredArgsConstructor(onConstructor = @_(@Inject))
public class className {
    @NonNull
    private final ClassA1 a1 implements ClassA;
    ...
}

但是显然这是行不通的,那么正确的方法是什么?

=================

编辑: 还是我应该这样做?

public class className {
        private ClassA a1;
        public className(A1 a1) {
        this.a1 = a1; }
    }

=================== 这是在听完Mykhailo Moskura的建议后的代码:

@Component
@RequiredArgsConstructor(onConstructor = @_(@Inject))
public class C {
     @NonNull
     private A b;
     public someFunction() {
        b.method();
     }
}

这里A是接口,而b是使用驼峰名称实现A的类。然后使用lombok注入b,然后在某些函数中调用b的某些方法。但是我意识到b.method仍然指向接口A,而不是B。

1 个答案:

答案 0 :(得分:3)

@NonNull不是必需的 Lombok将生成一个带有标记为final或@NonNull的字段的构造函数 您可以仅声明接口类型就自动接线 并以小写开头的驼峰形式给出实现类名称。 另外,您还需要将实现声明为bran以及要在其中注入的类。 @Inject是java ee CDI依赖项。 @Autowired是特定于弹簧的。 Spring支持两者,但它说使用@Autowired 这是一个示例:

public interface A{
}

@Component
public class B implements A{
}

@Component
public class C {
  private A a;
@Autowired
  public C(A a){
   this.a = a;  
}
}

Lombok示例:

 @RequiredArgsConstructor
   @Component
    public class C {
      //Here it will inject the implementation of A interface with name of implementation (As we have name of impl B we declare field as b , if HelloBeanImpl then helloBeanImpl
     private A b;
    }

但是,如果您有一个接口的许多实现,则可以将@Qualifier与bean的名称一起使用,或者将上述示例与lombok一起使用,其中A b其中b是实现的名称