java - Spring Autowire Annotation with Several Interface Implementations -


suppose have 1 interface

public interface {   public void dosomething(); } 

and 2 implementation classes

@component(value="aimpl1") public class aimpl1 implements {  }  @component(value="aimpl2") public class aimpl2 implements a{  } 

and class use "a" implementation:

@component public class myclass {   @autowire   a; } 

now if want inject aimpl1 add @qualifier("aimpl1") while if want inject aimpl2 add @qualifier("aimpl2")

the question is: possible instruct spring somehow implementations of "a" in case aimpl1 , aimpl2 , use application specific conventions choose appropriate implementation? example in case convention use implementation greatest suffix (i.e. aimpl2)?

edit: class myclass should not aware @ implementation lookup logic, should find property "a" set object of aimpl2.

assuming have hundreds of interfaces , implementations (as said in comment), , not want refactor code... tricky problem... , tricky solution:

you create custom beandefinitionregistrypostprocessor , implement either method postprocessbeandefinitionregistry or postprocessbeanfactory.

this way have access all bean definitions before instantiated , injected. logic find preferred implementation each 1 of interfaces, , then, set 1 primary.

@component public class custombeandefinitionregistrypostprocessor implements beandefinitionregistrypostprocessor {      @override     public void postprocessbeandefinitionregistry(             beandefinitionregistry registry) throws beansexception {            // method can used set primary bean, although            // beans defined in @configuration class not avalable here.      }      @override     public void postprocessbeanfactory(             configurablelistablebeanfactory beanfactory) throws beansexception {               // here, beans available including defined @configuration, @component, xml, etc.          // magic somehow find preferred bean name each interface          // have access bean-definition names with: beanfactory.getbeandefinitionnames()         string beanname = "aimpl2"; // let's 1          // definition bean , set primary         beanfactory.getbeandefinition(beanname).setprimary(true)      }    } 

the hard part find bean name, depends of specifics of application. guess having consistent naming convention help.

update:

it seems both methods in interface beandefinitionregistrypostprocessor can used purpose. having in mind in postprocessbeandefinitionregistry phase, beans configured through @configuration classes not yet available, noted in comments below.

on other hand indeed available in postprocessbeanfactory.


Comments

Popular posts from this blog

javascript - Count length of each class -

What design pattern is this code in Javascript? -

hadoop - Restrict secondarynamenode to be installed and run on any other node in the cluster -