作用
该方法的主要作用就是指定该类型接口,如果外部要注入该类型接口的对象,则会注入我们指定的对象,而不会去管其他接口实现类(与@Primary注解功能相同)
注意:直接通过容器.getBean(…class) 报错是一定的,void registerResolvableDependency(Class<?> dependencyType, @Nullable Object autowiredValue); 只能在 @Autowire 注入对象下失效。
beanFactory.registerResolvableDependency效果测试
编写ITestBean接口、ITestBeanFather类,ITestBeanA类与ITestBeanB类都继承ITestBeanFather类实现ITestBean接口,AutowiredBean类用来自动注入
public interface ITestBean {
void iTest();
}
public class ITestBeanFather {
}
@Component
public class ITestBeanA extends ITestBeanFather implements ITestBean{
@Override
public void iTest() {
System.out.println("ITestBeanA");
}
}
@Component
public class ITestBeanB extends ITestBeanFather implements ITestBean{
@Override
public void iTest() {
System.out.println("ITestBeanB");
}
}
@Component
public class AutowiredBean implements InitializingBean {
@Autowired
private ITestBean iTestBean;
@Autowired
private ITestBeanFather iTestBeanFather;
@Override
public void afterPropertiesSet() throws Exception {
iTestBean.iTest();
ITestBean bean = (ITestBean) this.iTestBeanFather;
bean.iTest();
}
}
编写配置类,使用Java配置类启动容器
@Configuration
@ComponentScan(basePackages = "itest.bean.aop")
public class SpringConfig {
}
客户端
public class Client3 {
public static void main(String[] args) {
try {
new AnnotationConfigApplicationContext(SpringConfig.class);
} catch (Exception e) {
/*
* 报错信息如下,因为使用接口类型找到了两个实现类对象所以spring蒙蔽了不知道该注入哪一个
* Error creating bean with name 'autowiredBean':
* Unsatisfied dependency expressed through field 'iTestBean';
* nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException:
* No qualifying bean of type 'itest.bean.aop.ITestBean'
* available: expected single matching bean but found 2: ITestBeanA,ITestBeanB
*
* 解决方案1: 使用 @Primary
* 解决方案2: 使用 使用beanFactory.registerResolvableDependency(接口或类,bean对象)
*/
System.out.println(e.getMessage());
}
}
}
编写BeanFactoryPostProcessor使用beanFactory.registerResolvableDependency(接口或类,bean对象)
@Component
public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
beanFactory.registerResolvableDependency(ITestBean.class,new ITestBeanB());
beanFactory.registerResolvableDependency(ITestBeanFather.class,new ITestBeanA());
}
}
再次测试即可通过!