Introduce processInjection() in CommonAnnotationBeanPostProcessor

To align with the existing processInjection() method in
AutowiredAnnotationBeanPostProcessor, this commit introduces an analogous
method in CommonAnnotationBeanPostProcessor.

Closes gh-31956
This commit is contained in:
Sam Brannen 2024-01-05 16:04:54 +01:00
parent 4b6126c057
commit f6b36a689a
2 changed files with 38 additions and 0 deletions

View File

@ -371,6 +371,29 @@ public class CommonAnnotationBeanPostProcessor extends InitDestroyAnnotationBean
return pvs;
}
/**
* <em>Native</em> processing method for direct calls with an arbitrary target
* instance, resolving all of its fields and methods which are annotated with
* one of the supported 'resource' annotation types.
* @param bean the target instance to process
* @throws BeanCreationException if resource injection failed
* @since 6.1.3
*/
public void processInjection(Object bean) throws BeanCreationException {
Class<?> clazz = bean.getClass();
InjectionMetadata metadata = findResourceMetadata(clazz.getName(), clazz, null);
try {
metadata.inject(bean, null, null);
}
catch (BeanCreationException ex) {
throw ex;
}
catch (Throwable ex) {
throw new BeanCreationException(
"Injection of resource dependencies failed for class [" + clazz + "]", ex);
}
}
private InjectionMetadata findResourceMetadata(String beanName, Class<?> clazz, @Nullable PropertyValues pvs) {
// Fall back to class name as cache key, for backwards compatibility with custom callers.

View File

@ -52,6 +52,7 @@ import static org.assertj.core.api.Assertions.assertThat;
*
* @author Juergen Hoeller
* @author Chris Beams
* @author Sam Brannen
*/
class CommonAnnotationBeanPostProcessorTests {
@ -65,6 +66,20 @@ class CommonAnnotationBeanPostProcessorTests {
bf.addBeanPostProcessor(bpp);
}
@Test
void processInjection() {
ResourceInjectionBean bean = new ResourceInjectionBean();
assertThat(bean.getTestBean()).isNull();
assertThat(bean.getTestBean2()).isNull();
TestBean tb = new TestBean();
bf.registerSingleton("testBean", tb);
bpp.processInjection(bean);
assertThat(bean.getTestBean()).isSameAs(tb);
assertThat(bean.getTestBean2()).isSameAs(tb);
}
@Test
void postConstructAndPreDestroy() {
bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(AnnotatedInitDestroyBean.class));