将 Spring Bean 自动装配到默认方法的接口中

pab*_*blo 7 java spring spring-boot

我需要向某些类实现的接口添加默认方法,但我的 IDE 抱怨 ( bean may not have been initialized)。代码将是这样的:

public interface IValidator {

    MyValidationBean beanToBeAutowired;
    ...
    default Boolean doSomeNewValidations(){
        return beanToBeAutowired.doSomeNewValidations();
    }
}
Run Code Online (Sandbox Code Playgroud)

是不允许自动装配到接口还是代码有问题?使用@Component界面上没有任何区别。

我宁愿保留这种设计而不是使用抽象类。

Ami*_*aik 7

我可以想到如下解决方案 -

public interface IValidator {

   public Service getBeanToBeAutowired();

   default Boolean doSomeNewValidations(){
    return getBeanToBeAutowired().doSomeNewValidations();
   }

}

public class ValidatorClass implements IValidator {

    @Autowire private Service service;

    @Override
    public Service getBeanToBeAutowired() {
        return service;
    }

}
Run Code Online (Sandbox Code Playgroud)


sha*_*zin 5

在 Java 中添加变量到接口中是不可能的。默认情况下它是一个public static final常量。因此,您必须执行以下操作之一:

MyValidationBean beanToBeAutowired = new MyValidationBeanImpl();
Run Code Online (Sandbox Code Playgroud)

或以下内容:

MyValidationBean beanToBeAutowired();

default Boolean doSomeNewValidations(){
    return beanToBeAutowired().doSomeNewValidations();
}
Run Code Online (Sandbox Code Playgroud)

并且可以重写beanToBeAutowired实现类中的方法。

  • 感谢您的建议,但切换到抽象类会更干净(就我而言)。 (2认同)