|
64 | 64 | import org.springframework.core.annotation.AnnotationUtils; |
65 | 65 | import org.springframework.core.annotation.OrderProviderComparator; |
66 | 66 | import org.springframework.core.annotation.OrderUtils; |
| 67 | +import org.springframework.lang.UsesJava8; |
67 | 68 | import org.springframework.util.Assert; |
68 | 69 | import org.springframework.util.ClassUtils; |
69 | 70 | import org.springframework.util.ObjectUtils; |
|
107 | 108 | public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory |
108 | 109 | implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable { |
109 | 110 |
|
110 | | - private static Class<?> javaxInjectProviderClass = null; |
111 | | - |
112 | 111 | private static Class<?> javaUtilOptionalClass = null; |
113 | 112 |
|
| 113 | + private static Class<?> javaxInjectProviderClass = null; |
| 114 | + |
114 | 115 | static { |
115 | 116 | try { |
116 | | - javaxInjectProviderClass = |
117 | | - ClassUtils.forName("javax.inject.Provider", DefaultListableBeanFactory.class.getClassLoader()); |
| 117 | + javaUtilOptionalClass = |
| 118 | + ClassUtils.forName("java.util.Optional", DefaultListableBeanFactory.class.getClassLoader()); |
118 | 119 | } |
119 | 120 | catch (ClassNotFoundException ex) { |
120 | | - // JSR-330 API not available - Provider interface simply not supported then. |
| 121 | + // Java 8 not available - Optional references simply not supported then. |
121 | 122 | } |
122 | 123 | try { |
123 | | - javaUtilOptionalClass = |
124 | | - ClassUtils.forName("java.util.Optional", DefaultListableBeanFactory.class.getClassLoader()); |
| 124 | + javaxInjectProviderClass = |
| 125 | + ClassUtils.forName("javax.inject.Provider", DefaultListableBeanFactory.class.getClassLoader()); |
125 | 126 | } |
126 | 127 | catch (ClassNotFoundException ex) { |
127 | | - // Java 8 not available - Optional references simply not supported then. |
| 128 | + // JSR-330 API not available - Provider interface simply not supported then. |
128 | 129 | } |
129 | 130 | } |
130 | 131 |
|
@@ -858,15 +859,15 @@ public Object resolveDependency(DependencyDescriptor descriptor, String beanName |
858 | 859 | Set<String> autowiredBeanNames, TypeConverter typeConverter) throws BeansException { |
859 | 860 |
|
860 | 861 | descriptor.initParameterNameDiscovery(getParameterNameDiscoverer()); |
861 | | - if (descriptor.getDependencyType().equals(ObjectFactory.class)) { |
| 862 | + if (descriptor.getDependencyType().equals(javaUtilOptionalClass)) { |
| 863 | + return new OptionalDependencyFactory().createOptionalDependency(descriptor, beanName); |
| 864 | + } |
| 865 | + else if (descriptor.getDependencyType().equals(ObjectFactory.class)) { |
862 | 866 | return new DependencyObjectFactory(descriptor, beanName); |
863 | 867 | } |
864 | 868 | else if (descriptor.getDependencyType().equals(javaxInjectProviderClass)) { |
865 | 869 | return new DependencyProviderFactory().createDependencyProvider(descriptor, beanName); |
866 | 870 | } |
867 | | - else if (descriptor.getDependencyType().equals(javaUtilOptionalClass)) { |
868 | | - return new OptionalDependencyFactory().createOptionalDependency(descriptor, beanName); |
869 | | - } |
870 | 871 | else { |
871 | 872 | Object result = getAutowireCandidateResolver().getLazyResolutionProxyIfNecessary(descriptor, beanName); |
872 | 873 | if (result == null) { |
@@ -1284,24 +1285,51 @@ private Object readResolve() { |
1284 | 1285 | } |
1285 | 1286 |
|
1286 | 1287 |
|
| 1288 | + /** |
| 1289 | + * Separate inner class for avoiding a hard dependency on the {@code javax.inject} API. |
| 1290 | + */ |
| 1291 | + @UsesJava8 |
| 1292 | + private class OptionalDependencyFactory { |
| 1293 | + |
| 1294 | + public Object createOptionalDependency(DependencyDescriptor descriptor, String beanName) { |
| 1295 | + DependencyDescriptor descriptorToUse = new DependencyDescriptor(descriptor) { |
| 1296 | + @Override |
| 1297 | + public boolean isRequired() { |
| 1298 | + return false; |
| 1299 | + } |
| 1300 | + }; |
| 1301 | + descriptorToUse.increaseNestingLevel(); |
| 1302 | + return Optional.ofNullable(doResolveDependency(descriptorToUse, beanName, null, null)); |
| 1303 | + } |
| 1304 | + } |
| 1305 | + |
| 1306 | + |
1287 | 1307 | /** |
1288 | 1308 | * Serializable ObjectFactory for lazy resolution of a dependency. |
1289 | 1309 | */ |
1290 | 1310 | private class DependencyObjectFactory implements ObjectFactory<Object>, Serializable { |
1291 | 1311 |
|
1292 | 1312 | private final DependencyDescriptor descriptor; |
1293 | 1313 |
|
| 1314 | + private final boolean optional; |
| 1315 | + |
1294 | 1316 | private final String beanName; |
1295 | 1317 |
|
1296 | 1318 | public DependencyObjectFactory(DependencyDescriptor descriptor, String beanName) { |
1297 | 1319 | this.descriptor = new DependencyDescriptor(descriptor); |
1298 | 1320 | this.descriptor.increaseNestingLevel(); |
| 1321 | + this.optional = this.descriptor.getDependencyType().equals(javaUtilOptionalClass); |
1299 | 1322 | this.beanName = beanName; |
1300 | 1323 | } |
1301 | 1324 |
|
1302 | 1325 | @Override |
1303 | 1326 | public Object getObject() throws BeansException { |
1304 | | - return doResolveDependency(this.descriptor, this.beanName, null, null); |
| 1327 | + if (this.optional) { |
| 1328 | + return new OptionalDependencyFactory().createOptionalDependency(this.descriptor, this.beanName); |
| 1329 | + } |
| 1330 | + else { |
| 1331 | + return doResolveDependency(this.descriptor, this.beanName, null, null); |
| 1332 | + } |
1305 | 1333 | } |
1306 | 1334 | } |
1307 | 1335 |
|
@@ -1332,22 +1360,4 @@ public Object createDependencyProvider(DependencyDescriptor descriptor, String b |
1332 | 1360 | } |
1333 | 1361 | } |
1334 | 1362 |
|
1335 | | - |
1336 | | - /** |
1337 | | - * Separate inner class for avoiding a hard dependency on the {@code javax.inject} API. |
1338 | | - */ |
1339 | | - private class OptionalDependencyFactory { |
1340 | | - |
1341 | | - public Object createOptionalDependency(DependencyDescriptor descriptor, String beanName) { |
1342 | | - DependencyDescriptor descriptorToUse = new DependencyDescriptor(descriptor) { |
1343 | | - @Override |
1344 | | - public boolean isRequired() { |
1345 | | - return false; |
1346 | | - } |
1347 | | - }; |
1348 | | - descriptorToUse.increaseNestingLevel(); |
1349 | | - return Optional.ofNullable(doResolveDependency(descriptorToUse, beanName, null, null)); |
1350 | | - } |
1351 | | - } |
1352 | | - |
1353 | 1363 | } |
0 commit comments