Spring Boot中接口多继承时如何无需Qualifier直接注入C接口实例
答案
存在可行方案,无需添加@Qualifier注解即可实现该注入需求。
原注入失败原因
默认状态下直接使用@Autowired C c会抛出NoSuchBeanDefinitionException异常:你现有注册到Spring容器中的AImpl、BImpl仅分别实现了A、B接口,不属于C接口的实现类,容器中没有匹配C类型的Bean实例,无法完成自动注入。
解决方案
你可以通过JDK动态代理生成C接口的代理实例,将方法调用自动路由到已有的AImpl、BImpl实例上,再将这个代理对象注册为Spring容器中的C类型Bean即可,完全不需要修改原有A、B相关的代码。
参考代码示例:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.lang.reflect.Proxy; @Configuration public class CProxyConfig { @Bean public C c(A aImpl, B bImpl) { // 生成C接口的动态代理对象 return (C) Proxy.newProxyInstance( C.class.getClassLoader(), new Class[]{C.class}, (proxy, method, args) -> { // 方法分发:如果是A接口定义的方法,调用AImpl的对应方法 if (A.class.isAssignableFrom(method.getDeclaringClass())) { return method.invoke(aImpl, args); } // 方法分发:如果是B接口定义的方法,调用BImpl的对应方法 else if (B.class.isAssignableFrom(method.getDeclaringClass())) { return method.invoke(bImpl, args); } // 如果是C接口自定义的方法,可自行补充实现逻辑 throw new UnsupportedOperationException("该方法暂未实现"); } ); } }
完成上述配置后,你就可以直接在业务代码中使用@Autowired C c注入实例,调用c.a()时会自动转发到AImpl的a()方法执行。
内容的提问来源于stack exchange,提问作者meriemB
相关产品推荐
相关产品推荐

