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

相关阅读

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

registerResolvableDependency() 方法

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

作用?

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

Spring源码笔记之beanFactory.registerResolvableDependency()方法_第1张图片
该方法在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注入对象的时候发现了多个,它不知道应该注入哪个对象而抛出异常,

Spring源码笔记之beanFactory.registerResolvableDependency()方法_第2张图片

怎么能不报错呢?

可以使用 @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对象

Spring源码笔记之beanFactory.registerResolvableDependency()方法_第3张图片

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

你可能感兴趣的:(spring框架)