Spring源码笔记之beanFactory.registerResolvableDependency()方法

相关阅读

Spring源码笔记之自动装配以及beanFactory.ignoreDependencyInterface()
类加载器的命名空间
使用Optional的orElse()重复执行问题

registerResolvableDependency() 方法

registerResolvableDependency()方法是声明在 ConfigurableListableBeanFactory接口中的
在初始化IOC中的时候,在AbstractApplicationContext#prepareBeanFactory
中被调用

作用?

在Spring自动装配的时候如果一个接口有多个实现类,并且都已经放到IOC中去了,
那么自动装配的时候就会出异常,因为spring不知道把哪个实现类注入进去,
但是如果我们自定义一个类,然后实现BeanFactoryPostProcessor接口
在该阶段调用这个方法,如果哪个地方要自动注入这个类型的对象的话,那么就注入进去我们指定的对象

在这里插入图片描述
该方法在springIOC初始化的时候的使用
由于BeanFactory会有很多实现,如果我们在Spring中直接想注入BeanFactory类型的对象,不这么做的话会报错的。Spring通过这个registerResolvableDependency()方法很好的解决了这个问题,当你想要注入BeanFactory对象的时候,Spring在初始化时期就帮我们指定了要注入哪个对象

该方法的主要作用就是指定该类型接口,如果外部要注入该类型接口的对象,则会注入我们指定的对象,而不会去管其他接口实现类

实战

定义 Component 接口


public interface Component {


}

然后创建两个Component的实现类,分别为 ComponentAImple 和 ComponentBImlp


@org.springframework.stereotype.Component
public class ComponentAImple implements Component {
   private String mark = "a";
}


@org.springframework.stereotype.Component
public class ComponentBImple implements Component {
   private String mark = "b";
}

创建一个junit单元测试类

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = SpringTest2Config.class)
public class TestSpring1 {

   @Autowired
   private Component component;


   @Test
   public void test(){

   }

}

注入一个 component类型的对象

上面这个程序启动肯定是会报错的

原因:因为Component类型的对象有两个,而且都是由Spring管理的,Spring注入对象的时候发现了多个,它不知道应该注入哪个对象而抛出异常,

在这里插入图片描述

怎么能不报错呢?

可以使用 @Primary 注解,但是这个注解不在这里讨论
我们可以使用 registerResolvableDependency()方法来实现

创建一个 TestRegisterResolvableDependency 类,实现BeanFactoryPostProcessor接口 并放到IOC容器中

@org.springframework.stereotype.Component
public class TestRegisterResolvableDependency implements BeanFactoryPostProcessor {


   @Override
   public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
       beanFactory.registerResolvableDependency(Component.class, new ComponentAImple());

   }
}


注意beanFactory.registerResolvableDependency(Component.class, new ComponentAImple()); 方法,这行代码的意思是,当有其他类要注入 Component类型的对象时,就给他注入我们这里自己创建的 ComponentAImple对象

在这里插入图片描述

运行程序,发现不报错了,而且注入进来的对象是我们创建的 ComponentAimple对象

在这里插入图片描述

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值