1717package org .springframework .beans .factory .annotation ;
1818
1919import java .io .Serializable ;
20+ import java .lang .annotation .Retention ;
21+ import java .lang .annotation .RetentionPolicy ;
2022import java .util .List ;
2123import java .util .Map ;
2224import java .util .Optional ;
@@ -574,6 +576,60 @@ public void testBeanAutowiredWithFactoryBean() {
574576 bf .destroySingletons ();
575577 }
576578
579+ @ Test
580+ public void testNullableFieldInjectionWithBeanAvailable () {
581+ DefaultListableBeanFactory bf = new DefaultListableBeanFactory ();
582+ AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor ();
583+ bpp .setBeanFactory (bf );
584+ bf .addBeanPostProcessor (bpp );
585+ bf .registerBeanDefinition ("annotatedBean" , new RootBeanDefinition (NullableFieldInjectionBean .class ));
586+ bf .registerBeanDefinition ("testBean" , new RootBeanDefinition (TestBean .class ));
587+
588+ NullableFieldInjectionBean bean = (NullableFieldInjectionBean ) bf .getBean ("annotatedBean" );
589+ assertSame (bf .getBean ("testBean" ), bean .getTestBean ());
590+ bf .destroySingletons ();
591+ }
592+
593+ @ Test
594+ public void testNullableFieldInjectionWithBeanNotAvailable () {
595+ DefaultListableBeanFactory bf = new DefaultListableBeanFactory ();
596+ AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor ();
597+ bpp .setBeanFactory (bf );
598+ bf .addBeanPostProcessor (bpp );
599+ bf .registerBeanDefinition ("annotatedBean" , new RootBeanDefinition (NullableFieldInjectionBean .class ));
600+
601+ NullableFieldInjectionBean bean = (NullableFieldInjectionBean ) bf .getBean ("annotatedBean" );
602+ assertNull (bean .getTestBean ());
603+ bf .destroySingletons ();
604+ }
605+
606+ @ Test
607+ public void testNullableMethodInjectionWithBeanAvailable () {
608+ DefaultListableBeanFactory bf = new DefaultListableBeanFactory ();
609+ AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor ();
610+ bpp .setBeanFactory (bf );
611+ bf .addBeanPostProcessor (bpp );
612+ bf .registerBeanDefinition ("annotatedBean" , new RootBeanDefinition (NullableMethodInjectionBean .class ));
613+ bf .registerBeanDefinition ("testBean" , new RootBeanDefinition (TestBean .class ));
614+
615+ NullableMethodInjectionBean bean = (NullableMethodInjectionBean ) bf .getBean ("annotatedBean" );
616+ assertSame (bf .getBean ("testBean" ), bean .getTestBean ());
617+ bf .destroySingletons ();
618+ }
619+
620+ @ Test
621+ public void testNullableMethodInjectionWithBeanNotAvailable () {
622+ DefaultListableBeanFactory bf = new DefaultListableBeanFactory ();
623+ AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor ();
624+ bpp .setBeanFactory (bf );
625+ bf .addBeanPostProcessor (bpp );
626+ bf .registerBeanDefinition ("annotatedBean" , new RootBeanDefinition (NullableMethodInjectionBean .class ));
627+
628+ NullableMethodInjectionBean bean = (NullableMethodInjectionBean ) bf .getBean ("annotatedBean" );
629+ assertNull (bean .getTestBean ());
630+ bf .destroySingletons ();
631+ }
632+
577633 @ Test
578634 public void testOptionalFieldInjectionWithBeanAvailable () {
579635 DefaultListableBeanFactory bf = new DefaultListableBeanFactory ();
@@ -1275,6 +1331,36 @@ public boolean isSingleton() {
12751331 }
12761332
12771333
1334+ @ Retention (RetentionPolicy .RUNTIME )
1335+ public @interface Nullable {}
1336+
1337+
1338+ public static class NullableFieldInjectionBean {
1339+
1340+ @ Inject @ Nullable
1341+ private TestBean testBean ;
1342+
1343+ public TestBean getTestBean () {
1344+ return this .testBean ;
1345+ }
1346+ }
1347+
1348+
1349+ public static class NullableMethodInjectionBean {
1350+
1351+ private TestBean testBean ;
1352+
1353+ @ Inject
1354+ public void setTestBean (@ Nullable TestBean testBean ) {
1355+ this .testBean = testBean ;
1356+ }
1357+
1358+ public TestBean getTestBean () {
1359+ return this .testBean ;
1360+ }
1361+ }
1362+
1363+
12781364 public static class OptionalFieldInjectionBean {
12791365
12801366 @ Inject
@@ -1291,8 +1377,8 @@ public static class OptionalMethodInjectionBean {
12911377 private Optional <TestBean > testBean ;
12921378
12931379 @ Inject
1294- public void setTestBean (Optional <TestBean > testBeanFactory ) {
1295- this .testBean = testBeanFactory ;
1380+ public void setTestBean (Optional <TestBean > testBean ) {
1381+ this .testBean = testBean ;
12961382 }
12971383
12981384 public Optional <TestBean > getTestBean () {
@@ -1317,8 +1403,8 @@ public static class OptionalListMethodInjectionBean {
13171403 private Optional <List <TestBean >> testBean ;
13181404
13191405 @ Inject
1320- public void setTestBean (Optional <List <TestBean >> testBeanFactory ) {
1321- this .testBean = testBeanFactory ;
1406+ public void setTestBean (Optional <List <TestBean >> testBean ) {
1407+ this .testBean = testBean ;
13221408 }
13231409
13241410 public Optional <List <TestBean >> getTestBean () {
@@ -1343,8 +1429,8 @@ public static class ProviderOfOptionalMethodInjectionBean {
13431429 private Provider <Optional <TestBean >> testBean ;
13441430
13451431 @ Inject
1346- public void setTestBean (Provider <Optional <TestBean >> testBeanFactory ) {
1347- this .testBean = testBeanFactory ;
1432+ public void setTestBean (Provider <Optional <TestBean >> testBean ) {
1433+ this .testBean = testBean ;
13481434 }
13491435
13501436 public Optional <TestBean > getTestBean () {
0 commit comments