0
点赞
收藏
分享

微信扫一扫

beanFactory.registerResolvableDependency函数作用

以沫的窝 2022-03-12 阅读 25

作用

该方法的主要作用就是指定该类型接口,如果外部要注入该类型接口的对象,则会注入我们指定的对象,而不会去管其他接口实现类(与@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());
	}
}

再次测试即可通过!

举报

相关推荐

0 条评论