Skip to content

Commit 6574393

Browse files
jhoellerunknown
authored andcommitted
Provider injection into prototype beans works for method parameters as well
Issue: SPR-9630
1 parent 3f1fb4e commit 6574393

File tree

2 files changed

+84
-16
lines changed

2 files changed

+84
-16
lines changed

spring-beans/src/main/java/org/springframework/beans/factory/config/DependencyDescriptor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ public DependencyDescriptor(Field field, boolean required, boolean eager) {
126126
* @param original the original descriptor to create a copy from
127127
*/
128128
public DependencyDescriptor(DependencyDescriptor original) {
129-
this.methodParameter = original.methodParameter;
129+
this.methodParameter = (original.methodParameter != null ? new MethodParameter(original.methodParameter) : null);
130130
this.field = original.field;
131131
this.declaringClass = original.declaringClass;
132132
this.methodName = original.methodName;

spring-beans/src/test/java/org/springframework/beans/factory/annotation/InjectAnnotationBeanPostProcessorTests.java

Lines changed: 83 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -372,66 +372,103 @@ public void testObjectFactoryInjection() {
372372
AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor();
373373
bpp.setBeanFactory(bf);
374374
bf.addBeanPostProcessor(bpp);
375-
bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(ObjectFactoryQualifierInjectionBean.class));
375+
bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(ObjectFactoryQualifierFieldInjectionBean.class));
376376
RootBeanDefinition bd = new RootBeanDefinition(TestBean.class);
377377
bd.addQualifier(new AutowireCandidateQualifier(Qualifier.class, "testBean"));
378378
bf.registerBeanDefinition("testBean", bd);
379379
bf.registerBeanDefinition("testBean2", new RootBeanDefinition(TestBean.class));
380380

381-
ObjectFactoryQualifierInjectionBean bean = (ObjectFactoryQualifierInjectionBean) bf.getBean("annotatedBean");
381+
ObjectFactoryQualifierFieldInjectionBean bean = (ObjectFactoryQualifierFieldInjectionBean) bf.getBean("annotatedBean");
382382
assertSame(bf.getBean("testBean"), bean.getTestBean());
383383
bf.destroySingletons();
384384
}
385385

386386
@Test
387-
public void testObjectFactoryInjectionIntoPrototypeBean() {
387+
public void testObjectFactoryQualifierInjection() {
388+
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
389+
AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor();
390+
bpp.setBeanFactory(bf);
391+
bf.addBeanPostProcessor(bpp);
392+
bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(ObjectFactoryQualifierFieldInjectionBean.class));
393+
RootBeanDefinition bd = new RootBeanDefinition(TestBean.class);
394+
bd.addQualifier(new AutowireCandidateQualifier(Qualifier.class, "testBean"));
395+
bf.registerBeanDefinition("testBean", bd);
396+
397+
ObjectFactoryQualifierFieldInjectionBean bean = (ObjectFactoryQualifierFieldInjectionBean) bf.getBean("annotatedBean");
398+
assertSame(bf.getBean("testBean"), bean.getTestBean());
399+
bf.destroySingletons();
400+
}
401+
402+
@Test
403+
public void testObjectFactoryFieldInjectionIntoPrototypeBean() {
388404
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
389405
bf.setAutowireCandidateResolver(new QualifierAnnotationAutowireCandidateResolver());
390406
AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor();
391407
bpp.setBeanFactory(bf);
392408
bf.addBeanPostProcessor(bpp);
393-
bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(ObjectFactoryQualifierInjectionBean.class, false));
409+
bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(ObjectFactoryQualifierFieldInjectionBean.class, false));
394410
RootBeanDefinition bd = new RootBeanDefinition(TestBean.class);
395411
bd.addQualifier(new AutowireCandidateQualifier(Qualifier.class, "testBean"));
396412
bf.registerBeanDefinition("testBean", bd);
397413
bf.registerBeanDefinition("testBean2", new RootBeanDefinition(TestBean.class));
398414

399-
ObjectFactoryQualifierInjectionBean bean = (ObjectFactoryQualifierInjectionBean) bf.getBean("annotatedBean");
415+
ObjectFactoryQualifierFieldInjectionBean bean = (ObjectFactoryQualifierFieldInjectionBean) bf.getBean("annotatedBean");
400416
assertSame(bf.getBean("testBean"), bean.getTestBean());
401-
ObjectFactoryQualifierInjectionBean anotherBean = (ObjectFactoryQualifierInjectionBean) bf.getBean("annotatedBean");
417+
ObjectFactoryQualifierFieldInjectionBean anotherBean = (ObjectFactoryQualifierFieldInjectionBean) bf.getBean("annotatedBean");
402418
assertNotSame(anotherBean, bean);
403419
assertSame(bf.getBean("testBean"), bean.getTestBean());
404420
}
405421

406422
@Test
407-
public void testObjectFactoryQualifierInjection() {
423+
public void testObjectFactoryMethodInjectionIntoPrototypeBean() {
408424
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
425+
bf.setAutowireCandidateResolver(new QualifierAnnotationAutowireCandidateResolver());
409426
AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor();
410427
bpp.setBeanFactory(bf);
411428
bf.addBeanPostProcessor(bpp);
412-
bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(ObjectFactoryQualifierInjectionBean.class));
429+
bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(ObjectFactoryQualifierMethodInjectionBean.class, false));
413430
RootBeanDefinition bd = new RootBeanDefinition(TestBean.class);
414431
bd.addQualifier(new AutowireCandidateQualifier(Qualifier.class, "testBean"));
415432
bf.registerBeanDefinition("testBean", bd);
433+
bf.registerBeanDefinition("testBean2", new RootBeanDefinition(TestBean.class));
434+
435+
ObjectFactoryQualifierMethodInjectionBean bean = (ObjectFactoryQualifierMethodInjectionBean) bf.getBean("annotatedBean");
436+
assertSame(bf.getBean("testBean"), bean.getTestBean());
437+
ObjectFactoryQualifierMethodInjectionBean anotherBean = (ObjectFactoryQualifierMethodInjectionBean) bf.getBean("annotatedBean");
438+
assertNotSame(anotherBean, bean);
439+
assertSame(bf.getBean("testBean"), bean.getTestBean());
440+
}
441+
442+
@Test
443+
public void testObjectFactoryWithBeanField() throws Exception {
444+
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
445+
AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor();
446+
bpp.setBeanFactory(bf);
447+
bf.addBeanPostProcessor(bpp);
448+
bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(ObjectFactoryFieldInjectionBean.class));
449+
bf.registerBeanDefinition("testBean", new RootBeanDefinition(TestBean.class));
450+
bf.setSerializationId("test");
416451

417-
ObjectFactoryQualifierInjectionBean bean = (ObjectFactoryQualifierInjectionBean) bf.getBean("annotatedBean");
452+
ObjectFactoryFieldInjectionBean bean = (ObjectFactoryFieldInjectionBean) bf.getBean("annotatedBean");
453+
assertSame(bf.getBean("testBean"), bean.getTestBean());
454+
bean = (ObjectFactoryFieldInjectionBean) SerializationTestUtils.serializeAndDeserialize(bean);
418455
assertSame(bf.getBean("testBean"), bean.getTestBean());
419456
bf.destroySingletons();
420457
}
421458

422459
@Test
423-
public void testObjectFactorySerialization() throws Exception {
460+
public void testObjectFactoryWithBeanMethod() throws Exception {
424461
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
425462
AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor();
426463
bpp.setBeanFactory(bf);
427464
bf.addBeanPostProcessor(bpp);
428-
bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(ObjectFactoryInjectionBean.class));
465+
bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(ObjectFactoryMethodInjectionBean.class));
429466
bf.registerBeanDefinition("testBean", new RootBeanDefinition(TestBean.class));
430467
bf.setSerializationId("test");
431468

432-
ObjectFactoryInjectionBean bean = (ObjectFactoryInjectionBean) bf.getBean("annotatedBean");
469+
ObjectFactoryMethodInjectionBean bean = (ObjectFactoryMethodInjectionBean) bf.getBean("annotatedBean");
433470
assertSame(bf.getBean("testBean"), bean.getTestBean());
434-
bean = (ObjectFactoryInjectionBean) SerializationTestUtils.serializeAndDeserialize(bean);
471+
bean = (ObjectFactoryMethodInjectionBean) SerializationTestUtils.serializeAndDeserialize(bean);
435472
assertSame(bf.getBean("testBean"), bean.getTestBean());
436473
bf.destroySingletons();
437474
}
@@ -901,7 +938,7 @@ public Map<String, TestBean> getTestBeanMap() {
901938
}
902939

903940

904-
public static class ObjectFactoryInjectionBean implements Serializable {
941+
public static class ObjectFactoryFieldInjectionBean implements Serializable {
905942

906943
@Inject
907944
private Provider<TestBean> testBeanFactory;
@@ -912,7 +949,22 @@ public TestBean getTestBean() {
912949
}
913950

914951

915-
public static class ObjectFactoryQualifierInjectionBean {
952+
public static class ObjectFactoryMethodInjectionBean implements Serializable {
953+
954+
private Provider<TestBean> testBeanFactory;
955+
956+
@Inject
957+
public void setTestBeanFactory(Provider<TestBean> testBeanFactory) {
958+
this.testBeanFactory = testBeanFactory;
959+
}
960+
961+
public TestBean getTestBean() {
962+
return this.testBeanFactory.get();
963+
}
964+
}
965+
966+
967+
public static class ObjectFactoryQualifierFieldInjectionBean {
916968

917969
@Inject
918970
@Named("testBean")
@@ -924,6 +976,22 @@ public TestBean getTestBean() {
924976
}
925977

926978

979+
public static class ObjectFactoryQualifierMethodInjectionBean {
980+
981+
private Provider<?> testBeanFactory;
982+
983+
@Inject
984+
@Named("testBean")
985+
public void setTestBeanFactory(Provider<?> testBeanFactory) {
986+
this.testBeanFactory = testBeanFactory;
987+
}
988+
989+
public TestBean getTestBean() {
990+
return (TestBean) this.testBeanFactory.get();
991+
}
992+
}
993+
994+
927995
public static class ObjectFactoryListFieldInjectionBean implements Serializable {
928996

929997
@Inject

0 commit comments

Comments
 (0)