简体   繁体   中英

Autowire Spring Bean into interface for default method

I need to add a default method to an interface some classes implement, but my IDE complains ( bean may not have been initialized ). Code would be something like this:

public interface IValidator {

    MyValidationBean beanToBeAutowired;
    ...
    default Boolean doSomeNewValidations(){
        return beanToBeAutowired.doSomeNewValidations();
    }
}

Is it just that autowiring into interfaces is not allowed or there's something wrong with the code? Using @Component on the interface doesn't make any difference.

I'd rather keep this design instead of using an abstract class.

i can think of solution as below -

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

}

Adding a Variable into interface is not possible in Java. It will be by default a public static final constant. So you have to do either the following:

MyValidationBean beanToBeAutowired = new MyValidationBeanImpl();

or the following:

MyValidationBean beanToBeAutowired();

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

And you can override the beanToBeAutowired method in the implementation class.

Just an idea , send validation bean to interface as parameter ;

public interface IValidator {

    default Boolean doSomeNewValidations(MyValidationBean beanToBeAutowired){
        return beanToBeAutowired.doSomeNewValidations();
    }
}

Your callerClass ;

public class CallerClass implements IValidator{

    @Autowired
    MyValidationBean beanToBeAutowired;
    ...

    doSomeNewValidations(beanToBeAutowired);

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM