1.AnnotationConfigServletWebApplicationContext
举个例子,有个接口InterFaceA,它有2个实现类A1和A2 那么,如果一个类B 依赖了InterFaceA,此时sprig不知道要注入哪个实现类,
可以通过 使用@primary注解 或者 使用@Qualifier("a1")、@resource("a1")注解来解决
但是在spring框架内部,碰到B对象,要依赖于A类型的接口对象时,先无视掉这个依赖,像beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
然后后面再通过Aware接口类,再回调一次,set值
2.registerResolvableDependency
可以通过BeanFactoryPostProcessor后置处理器的方式,
beanFactory.registerResolvableDependency(InterFaceA.class,beanFactory.getBean("a1")); //意思是,当遇到需要注入InterFaceA.class的地方,优先使用A1的对象,记得,第二个参数是对象

3.registerResolvableDependency的另外一个用法
beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
beanFactory.registerResolvableDependency(ResourceLoader.class, this);
beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
beanFactory.registerResolvableDependency(ApplicationContext.class, this);
beanFactory.registerResolvableDependency(ServletRequest.class, new RequestObjectFactory());
beanFactory.registerResolvableDependency(ServletResponse.class, new ResponseObjectFactory());
beanFactory.registerResolvableDependency(HttpSession.class, new SessionObjectFactory());
beanFactory.registerResolvableDependency(WebRequest.class, new WebRequestObjectFactory());

在spring容器中,内置了上面8个对象,可以通过@Autowired注解直接取到,DefaultListableBeanFactory#findAutowireCandidates中的逻辑,

Map<Class<?>, Object> resolvableDependencies,如果在里面,直接取对象;如果是ObjectFactory工厂类型的话,调用工厂类的getObject方法取到对象
@Autowired
private BeanFactory beanFactory;

@Autowired
private HttpSession httpSession;