Skip to content

Commit a355c96

Browse files
committed
Refine bean get
1 parent 8a966e6 commit a355c96

File tree

31 files changed

+299
-155
lines changed

31 files changed

+299
-155
lines changed

dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/ClusterScopeModelInitializer.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@
2121
import org.apache.dubbo.rpc.cluster.support.ClusterUtils;
2222
import org.apache.dubbo.rpc.model.ApplicationModel;
2323
import org.apache.dubbo.rpc.model.FrameworkModel;
24-
import org.apache.dubbo.rpc.model.ModuleModel;
2524
import org.apache.dubbo.rpc.model.ScopeModelInitializer;
2625

2726
public class ClusterScopeModelInitializer implements ScopeModelInitializer {
27+
2828
@Override
2929
public void initializeFrameworkModel(FrameworkModel frameworkModel) {
3030
ScopeBeanFactory beanFactory = frameworkModel.getBeanFactory();
@@ -36,7 +36,4 @@ public void initializeApplicationModel(ApplicationModel applicationModel) {
3636
ScopeBeanFactory beanFactory = applicationModel.getBeanFactory();
3737
beanFactory.registerBean(ClusterUtils.class);
3838
}
39-
40-
@Override
41-
public void initializeModuleModel(ModuleModel moduleModel) {}
4239
}

dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/MergeableClusterScopeModelInitializer.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,13 @@
1919
import org.apache.dubbo.common.beans.factory.ScopeBeanFactory;
2020
import org.apache.dubbo.rpc.cluster.merger.MergerFactory;
2121
import org.apache.dubbo.rpc.model.ApplicationModel;
22-
import org.apache.dubbo.rpc.model.FrameworkModel;
23-
import org.apache.dubbo.rpc.model.ModuleModel;
2422
import org.apache.dubbo.rpc.model.ScopeModelInitializer;
2523

2624
public class MergeableClusterScopeModelInitializer implements ScopeModelInitializer {
27-
@Override
28-
public void initializeFrameworkModel(FrameworkModel frameworkModel) {}
2925

3026
@Override
3127
public void initializeApplicationModel(ApplicationModel applicationModel) {
3228
ScopeBeanFactory beanFactory = applicationModel.getBeanFactory();
3329
beanFactory.registerBean(MergerFactory.class);
3430
}
35-
36-
@Override
37-
public void initializeModuleModel(ModuleModel moduleModel) {}
3831
}

dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/mesh/MeshScopeModelInitializer.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,10 @@
1818

1919
import org.apache.dubbo.common.beans.factory.ScopeBeanFactory;
2020
import org.apache.dubbo.rpc.cluster.router.mesh.route.MeshRuleManager;
21-
import org.apache.dubbo.rpc.model.ApplicationModel;
22-
import org.apache.dubbo.rpc.model.FrameworkModel;
2321
import org.apache.dubbo.rpc.model.ModuleModel;
2422
import org.apache.dubbo.rpc.model.ScopeModelInitializer;
2523

2624
public class MeshScopeModelInitializer implements ScopeModelInitializer {
27-
@Override
28-
public void initializeFrameworkModel(FrameworkModel frameworkModel) {}
29-
30-
@Override
31-
public void initializeApplicationModel(ApplicationModel applicationModel) {}
3225

3326
public void initializeModuleModel(ModuleModel moduleModel) {
3427
ScopeBeanFactory beanFactory = moduleModel.getBeanFactory();

dubbo-common/src/main/java/org/apache/dubbo/common/beans/factory/ScopeBeanFactory.java

Lines changed: 96 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,12 @@
2424
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
2525
import org.apache.dubbo.common.logger.LoggerFactory;
2626
import org.apache.dubbo.common.resource.Disposable;
27+
import org.apache.dubbo.common.resource.Initializable;
2728
import org.apache.dubbo.common.utils.CollectionUtils;
2829
import org.apache.dubbo.common.utils.ConcurrentHashSet;
2930
import org.apache.dubbo.common.utils.Pair;
3031
import org.apache.dubbo.common.utils.StringUtils;
32+
import org.apache.dubbo.common.utils.TypeUtils;
3133
import org.apache.dubbo.rpc.model.ScopeModelAccessor;
3234

3335
import java.util.ArrayList;
@@ -39,6 +41,7 @@
3941
import java.util.concurrent.atomic.AtomicBoolean;
4042
import java.util.concurrent.atomic.AtomicInteger;
4143
import java.util.function.Function;
44+
import java.util.function.Supplier;
4245
import java.util.stream.Collectors;
4346

4447
import static org.apache.dubbo.common.constants.LoggerCodeConstants.CONFIG_FAILED_DESTROY_INVOKER;
@@ -55,6 +58,7 @@ public final class ScopeBeanFactory {
5558
private final List<ExtensionPostProcessor> extensionPostProcessors;
5659
private final Map<Class<?>, AtomicInteger> beanNameIdCounterMap = CollectionUtils.newConcurrentHashMap();
5760
private final List<BeanInfo> registeredBeanInfos = new CopyOnWriteArrayList<>();
61+
private final List<BeanDefinition<?>> registeredBeanDefinitions = new CopyOnWriteArrayList<>();
5862
private InstantiationStrategy instantiationStrategy;
5963
private final AtomicBoolean destroyed = new AtomicBoolean();
6064
private final Set<Class<?>> registeredClasses = new ConcurrentHashSet<>();
@@ -87,6 +91,27 @@ public <T> T registerBean(String name, Class<T> clazz) throws ScopeBeanException
8791
return getOrRegisterBean(name, clazz);
8892
}
8993

94+
public <T> void registerBeanDefinition(Class<T> bean) {
95+
registerBeanDefinition(null, bean);
96+
}
97+
98+
public <T> void registerBeanDefinition(String name, Class<T> bean) {
99+
registeredBeanDefinitions.add(new BeanDefinition<>(name, bean));
100+
}
101+
102+
public <T> void registerBeanFactory(Supplier<T> factory) {
103+
registerBeanFactory(null, factory);
104+
}
105+
106+
@SuppressWarnings("unchecked")
107+
public <T> void registerBeanFactory(String name, Supplier<T> factory) {
108+
Class<T> clazz = (Class<T>) TypeUtils.getSuperGenericType(factory.getClass(), 0);
109+
if (clazz == null) {
110+
throw new ScopeBeanException("unable to determine bean class from factory's superclass or interface");
111+
}
112+
registeredBeanDefinitions.add(new BeanDefinition<>(name, clazz, factory));
113+
}
114+
90115
private <T> T createAndRegisterBean(String name, Class<T> clazz) {
91116
checkDestroyed();
92117
T instance = getBean(name, clazz);
@@ -174,6 +199,9 @@ private void initializeBean(String name, Object bean) {
174199
for (ExtensionPostProcessor processor : extensionPostProcessors) {
175200
processor.postProcessAfterInitialization(bean, name);
176201
}
202+
if (bean instanceof Initializable) {
203+
((Initializable) bean).initialize(extensionAccessor);
204+
}
177205
} catch (Exception e) {
178206
throw new ScopeBeanException(
179207
"register bean failed! name=" + name + ", type="
@@ -182,9 +210,48 @@ private void initializeBean(String name, Object bean) {
182210
}
183211
}
184212

213+
@SuppressWarnings("SynchronizationOnLocalVariableOrMethodParameter")
214+
private void initializeBeanDefinitions(Class<?> type) {
215+
for (int i = 0, size = registeredBeanDefinitions.size(); i < size; i++) {
216+
BeanDefinition<?> definition = registeredBeanDefinitions.get(i);
217+
if (definition.initialized) {
218+
continue;
219+
}
220+
221+
Class<?> beanClass = definition.beanClass;
222+
if (!type.isAssignableFrom(beanClass)) {
223+
continue;
224+
}
225+
synchronized (type) {
226+
if (definition.initialized) {
227+
continue;
228+
}
229+
230+
Object bean;
231+
Supplier<?> factory = definition.beanFactory;
232+
if (factory == null) {
233+
try {
234+
bean = instantiationStrategy.instantiate(beanClass);
235+
} catch (Throwable e) {
236+
throw new ScopeBeanException("create bean instance failed, type=" + beanClass.getName(), e);
237+
}
238+
} else {
239+
initializeBean(definition.name, factory);
240+
try {
241+
bean = factory.get();
242+
} catch (Exception e) {
243+
throw new ScopeBeanException("create bean instance failed, type=" + beanClass.getName(), e);
244+
}
245+
}
246+
registerBean(definition.name, bean);
247+
definition.initialized = true;
248+
}
249+
}
250+
}
251+
185252
private boolean containsBean(String name, Object bean) {
186253
for (BeanInfo beanInfo : registeredBeanInfos) {
187-
if (beanInfo.instance == bean && (name == null || StringUtils.isEquals(name, beanInfo.name))) {
254+
if (beanInfo.instance == bean && (name == null || name.equals(beanInfo.name))) {
188255
return true;
189256
}
190257
}
@@ -199,6 +266,8 @@ private int getNextId(Class<?> beanClass) {
199266

200267
@SuppressWarnings("unchecked")
201268
public <T> List<T> getBeansOfType(Class<T> type) {
269+
initializeBeanDefinitions(type);
270+
202271
List<T> currentBeans = (List<T>) registeredBeanInfos.stream()
203272
.filter(beanInfo -> type.isInstance(beanInfo.instance))
204273
.map(beanInfo -> beanInfo.instance)
@@ -244,6 +313,9 @@ private <T> T getBeanInternal(String name, Class<T> type) {
244313
if (type == Object.class) {
245314
return null;
246315
}
316+
317+
initializeBeanDefinitions(type);
318+
247319
List<BeanInfo> candidates = null;
248320
BeanInfo firstCandidate = null;
249321
for (BeanInfo beanInfo : registeredBeanInfos) {
@@ -301,6 +373,7 @@ public void destroy() {
301373
}
302374
}
303375
registeredBeanInfos.clear();
376+
registeredBeanDefinitions.clear();
304377
beanCache.clear();
305378
}
306379
}
@@ -315,16 +388,36 @@ private void checkDestroyed() {
315388
}
316389
}
317390

318-
static class BeanInfo {
391+
static final class BeanInfo {
319392
private final String name;
320393
private final Object instance;
321394

322-
public BeanInfo(String name, Object instance) {
395+
BeanInfo(String name, Object instance) {
323396
this.name = name;
324397
this.instance = instance;
325398
}
326399
}
327400

401+
static final class BeanDefinition<T> {
402+
403+
private final String name;
404+
private final Class<T> beanClass;
405+
private final Supplier<T> beanFactory;
406+
private volatile boolean initialized;
407+
408+
BeanDefinition(String name, Class<T> beanClass) {
409+
this.name = name;
410+
this.beanClass = beanClass;
411+
beanFactory = null;
412+
}
413+
414+
BeanDefinition(String name, Class<T> beanClass, Supplier<T> beanFactory) {
415+
this.name = name;
416+
this.beanClass = beanClass;
417+
this.beanFactory = beanFactory;
418+
}
419+
}
420+
328421
public Set<Class<?>> getRegisteredClasses() {
329422
return registeredClasses;
330423
}

dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionAccessor.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,6 @@ default <T> T getDefaultExtension(Class<T> type) {
4646
return extensionLoader != null ? extensionLoader.getDefaultExtension() : null;
4747
}
4848

49-
default <T> T getDefaultExtensionOrNull(Class<T> type) {
50-
ExtensionLoader<T> extensionLoader = getExtensionLoader(type);
51-
if (extensionLoader == null) {
52-
return null;
53-
}
54-
return extensionLoader.getExtension(extensionLoader.getDefaultExtensionName(), true);
55-
}
56-
5749
default <T> List<T> getActivateExtensions(Class<T> type) {
5850
ExtensionLoader<T> extensionLoader = getExtensionLoader(type);
5951
return extensionLoader != null ? extensionLoader.getActivateExtensions() : Collections.emptyList();
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
package org.apache.dubbo.common.resource;
18+
19+
import org.apache.dubbo.common.extension.ExtensionAccessor;
20+
21+
/**
22+
* An interface for Initializing resources
23+
*/
24+
public interface Initializable {
25+
26+
default void initialize(ExtensionAccessor accessor) {
27+
initialize();
28+
}
29+
30+
default void initialize() {}
31+
}

dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ScopeModelInitializer.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,12 @@
2222
@SPI(scope = ExtensionScope.SELF)
2323
public interface ScopeModelInitializer {
2424

25-
void initializeFrameworkModel(FrameworkModel frameworkModel);
25+
default void initializeFrameworkModel(FrameworkModel frameworkModel) {}
26+
;
2627

27-
void initializeApplicationModel(ApplicationModel applicationModel);
28+
default void initializeApplicationModel(ApplicationModel applicationModel) {}
29+
;
2830

29-
void initializeModuleModel(ModuleModel moduleModel);
31+
default void initializeModuleModel(ModuleModel moduleModel) {}
32+
;
3033
}

dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/MetadataScopeModelInitializer.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,13 @@
1818

1919
import org.apache.dubbo.common.beans.factory.ScopeBeanFactory;
2020
import org.apache.dubbo.rpc.model.ApplicationModel;
21-
import org.apache.dubbo.rpc.model.FrameworkModel;
22-
import org.apache.dubbo.rpc.model.ModuleModel;
2321
import org.apache.dubbo.rpc.model.ScopeModelInitializer;
2422

2523
public class MetadataScopeModelInitializer implements ScopeModelInitializer {
26-
@Override
27-
public void initializeFrameworkModel(FrameworkModel frameworkModel) {}
2824

2925
@Override
3026
public void initializeApplicationModel(ApplicationModel applicationModel) {
3127
ScopeBeanFactory beanFactory = applicationModel.getBeanFactory();
3228
beanFactory.registerBean(MetadataReportInstance.class);
3329
}
34-
35-
@Override
36-
public void initializeModuleModel(ModuleModel moduleModel) {}
3730
}

dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/MetricsScopeModelInitializer.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,13 @@
1919
import org.apache.dubbo.common.beans.factory.ScopeBeanFactory;
2020
import org.apache.dubbo.metrics.event.MetricsDispatcher;
2121
import org.apache.dubbo.rpc.model.ApplicationModel;
22-
import org.apache.dubbo.rpc.model.FrameworkModel;
23-
import org.apache.dubbo.rpc.model.ModuleModel;
2422
import org.apache.dubbo.rpc.model.ScopeModelInitializer;
2523

2624
public class MetricsScopeModelInitializer implements ScopeModelInitializer {
2725

28-
@Override
29-
public void initializeFrameworkModel(FrameworkModel frameworkModel) {}
30-
3126
@Override
3227
public void initializeApplicationModel(ApplicationModel applicationModel) {
3328
ScopeBeanFactory beanFactory = applicationModel.getBeanFactory();
3429
beanFactory.registerBean(MetricsDispatcher.class);
3530
}
36-
37-
@Override
38-
public void initializeModuleModel(ModuleModel moduleModel) {}
3931
}

dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/QosScopeModelInitializer.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@
2222
import org.apache.dubbo.qos.server.Server;
2323
import org.apache.dubbo.rpc.model.ApplicationModel;
2424
import org.apache.dubbo.rpc.model.FrameworkModel;
25-
import org.apache.dubbo.rpc.model.ModuleModel;
2625
import org.apache.dubbo.rpc.model.ScopeModelInitializer;
2726

2827
public class QosScopeModelInitializer implements ScopeModelInitializer {
28+
2929
@Override
3030
public void initializeFrameworkModel(FrameworkModel frameworkModel) {
3131
ScopeBeanFactory beanFactory = frameworkModel.getBeanFactory();
@@ -38,7 +38,4 @@ public void initializeApplicationModel(ApplicationModel applicationModel) {
3838
ScopeBeanFactory beanFactory = applicationModel.getBeanFactory();
3939
beanFactory.registerBean(ActuatorCommandExecutor.class);
4040
}
41-
42-
@Override
43-
public void initializeModuleModel(ModuleModel moduleModel) {}
4441
}

0 commit comments

Comments
 (0)