|
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