Assuming Provider
is javax.inject.Provider
, Spring will very much autowire a Provider
implementation into this field
@Autowired
private Provider<Foo> fooProvider;
For example, this is done through the following call hierarchy
AutowiredAnnotationBeanPostProcessor#inject(Object bean, String beanName, PropertyValues pvs)
DefaultListableBeanFactory#resolveDependency(DependencyDescriptor descriptor, String beanName,Set<String> autowiredBeanNames, TypeConverter typeConverter)
DependencyProviderFactory#createDependencyProvider(DependencyDescriptor descriptor, String beanName)
which creates a DependencyProvider
object which is implemented as
private class DependencyProvider extends DependencyObjectFactory implements Provider<Object> {
public DependencyProvider(DependencyDescriptor descriptor, String beanName) {
super(descriptor, beanName);
}
@Override
public Object get() throws BeansException {
return getObject();
}
}
where getObject()
fetches the bean from the enclosing DefaultListableBeanFactory
instance.
So, if anything, you are probably getting your exception when trying to call
fooProvider.get();
because that tries to get a Foo
bean from the context and doesn't find one.