Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring注入接口实现_Java_Spring_Dependency Injection_Interface - Fatal编程技术网

Java Spring注入接口实现

Java Spring注入接口实现,java,spring,dependency-injection,interface,Java,Spring,Dependency Injection,Interface,我想使用lombok注入一个从如下接口实现的类: @RequiredArgsConstructor(onConstructor = @_(@Inject)) public class className { @NonNull private final ClassA1 a1 implements ClassA; ... } 但是很明显这是行不通的,那么正确的方法是什么呢 ================= 编辑: 还是我应该这样做 public class classN

我想使用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是用camelcase名称实现A的类。我使用lombok注入了b,现在在函数中调用了b的一些方法。但是我意识到b.method仍然指向接口A,而不是b。

@NonNull不是必需的 Lombok将生成一个带有标记为final或@NonNull的字段的构造函数
只需声明接口类型,即可自动连线 并从小写开始以驼峰形式给出实现类名。 此外,还需要将实现声明为bran,并将其注入到类中。 @Inject是JavaEECDI依赖项。 @自动连线是特定于弹簧的。 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;  
}
}
龙目岛样本:

 @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是实现的名称

只需将类型作为接口而不是类,这就是拥有接口的全部意义。因此,
private final ClassA a1
而不是
private final ClassA a1
。谢谢,这很有意义。但是在注入“privateffinalclassaa1”之后,我想将a1指定为ClassA1,我应该怎么做?(类似于:private List l,然后l=new ArrayList())
ClassA1
是一个
ClassA
,因为它实现了这个接口。是的,肯定是这样。但是,如果我想以后特别使用ClassA1,我应该怎么做呢?我能做像a1=新课a1()这样的事吗?可以,如上所述,
ClassA1
ClassA
。这就是基本的Java…“autowire只是声明了接口类型并给出了实现类名”,我该怎么做?谢谢你的代码,我想“private B B”应该是“private A B”?下面是一个示例列表,谢谢。仍然被lombok示例“private A b”弄糊涂了,A是接口名,而b只是一个随机名。那么A怎么知道实现A的是类B呢?B-是从小写开始的实现类的名称(使用CamelCase),例如,如果我有接口HelloWorld和实现它的类HelloWorldImpl,我需要编写HelloWorldImpl