Skip to content

Commit

Permalink
Introduce processInjection() in CommonAnnotationBeanPostProcessor
Browse files Browse the repository at this point in the history
To align with the existing processInjection() method in
AutowiredAnnotationBeanPostProcessor, this commit introduces an analogous
method in CommonAnnotationBeanPostProcessor.

Closes gh-31956
  • Loading branch information
sbrannen committed Jan 5, 2024
1 parent 4b6126c commit f6b36a6
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -371,6 +371,29 @@ public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, Str
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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
*
* @author Juergen Hoeller
* @author Chris Beams
* @author Sam Brannen
*/
class CommonAnnotationBeanPostProcessorTests {

Expand All @@ -65,6 +66,20 @@ void setup() {
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));
Expand Down

0 comments on commit f6b36a6

Please sign in to comment.