Skip to content

Commit 272b149

Browse files
authored
Merge pull request #262 from mercyblitz/dev-1.x
Enhance auto-registration and bean management in Spring context
2 parents c3ea68d + 8d74f24 commit 272b149

13 files changed

Lines changed: 676 additions & 118 deletions

File tree

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,8 @@ Choose the version that matches your Spring Framework line:
9191

9292
| Branch | Spring Framework compatibility | Latest version |
9393
|--------|--------------------------------|----------------|
94-
| `main` | 6.0.x – 7.0.x | `0.2.30` |
95-
| `1.x` | 4.3.x – 5.3.x | `0.1.30` |
94+
| `main` | 6.0.x – 7.0.x | `0.2.31` |
95+
| `1.x` | 4.3.x – 5.3.x | `0.1.31` |
9696

9797
### 2. Add individual modules
9898

microsphere-spring-context/src/main/java/io/microsphere/spring/beans/factory/support/BeanRegistrar.java

Lines changed: 365 additions & 0 deletions
Large diffs are not rendered by default.

microsphere-spring-context/src/main/java/io/microsphere/spring/beans/factory/support/ListenableAutowireCandidateResolverInitializer.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,11 @@
1919
import io.microsphere.annotation.ConfigurationProperty;
2020
import io.microsphere.constants.PropertyConstants;
2121
import io.microsphere.spring.context.ConfigurableApplicationContextInitializer;
22-
import io.microsphere.spring.core.env.ListenableConfigurableEnvironment;
2322
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
24-
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
2523
import org.springframework.context.ApplicationContextInitializer;
2624
import org.springframework.context.ConfigurableApplicationContext;
2725
import org.springframework.core.env.ConfigurableEnvironment;
2826

29-
import static io.microsphere.spring.beans.factory.BeanFactoryUtils.asBeanDefinitionRegistry;
3027
import static io.microsphere.spring.beans.factory.support.BeanRegistrar.registerBeanDefinition;
3128
import static io.microsphere.spring.constants.PropertyConstants.MICROSPHERE_SPRING_PROPERTY_NAME_PREFIX;
3229
import static java.lang.Boolean.parseBoolean;
@@ -75,7 +72,7 @@
7572
public class ListenableAutowireCandidateResolverInitializer extends ConfigurableApplicationContextInitializer {
7673

7774
/**
78-
* The prefix of the property name of {@link ListenableConfigurableEnvironment} : "microsphere.spring.listenable-autowire-candidate-resolver."
75+
* The prefix of the property name of {@link ListenableAutowireCandidateResolver} : "microsphere.spring.listenable-autowire-candidate-resolver."
7976
*/
8077
public static final String PROPERTY_NAME_PREFIX = MICROSPHERE_SPRING_PROPERTY_NAME_PREFIX + "listenable-autowire-candidate-resolver.";
8178

@@ -99,8 +96,7 @@ public class ListenableAutowireCandidateResolverInitializer extends Configurable
9996
@Override
10097
protected void initialize(ConfigurableApplicationContext context, ConfigurableEnvironment environment) {
10198
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
102-
BeanDefinitionRegistry beanDefinitionRegistry = asBeanDefinitionRegistry(beanFactory);
103-
registerBeanDefinition(beanDefinitionRegistry, ListenableAutowireCandidateResolver.class);
99+
registerBeanDefinition(beanFactory, ListenableAutowireCandidateResolver.class);
104100
}
105101

106102
@Override

microsphere-spring-context/src/main/java/io/microsphere/spring/config/CollectingConfigurationPropertyListener.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
2626
import org.springframework.core.env.ConfigurablePropertyResolver;
2727

28-
import static io.microsphere.spring.beans.factory.BeanFactoryUtils.asBeanDefinitionRegistry;
2928
import static io.microsphere.spring.beans.factory.support.BeanRegistrar.registerBean;
3029
import static io.microsphere.spring.beans.factory.support.BeanRegistrar.registerBeanDefinition;
3130
import static org.springframework.util.SystemPropertyUtils.PLACEHOLDER_PREFIX;
@@ -221,9 +220,8 @@ public void afterSetPlaceholderSuffix(ConfigurablePropertyResolver propertyResol
221220
@Override
222221
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
223222
this.beanFactory = beanFactory;
224-
BeanDefinitionRegistry registry = asBeanDefinitionRegistry(beanFactory);
225-
registerBeanDefinition(registry, ConfigurationPropertyRepository.BEAN_NAME, ConfigurationPropertyRepository.class);
226-
registerBean(registry, BEAN_NAME, this);
223+
registerBeanDefinition(beanFactory, ConfigurationPropertyRepository.BEAN_NAME, ConfigurationPropertyRepository.class);
224+
registerBean(beanFactory, BEAN_NAME, this);
227225
}
228226

229227
/**

microsphere-spring-context/src/main/java/io/microsphere/spring/context/ConfigurableApplicationContextInitializer.java

Lines changed: 74 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,39 @@
1818
package io.microsphere.spring.context;
1919

2020
import io.microsphere.logging.Logger;
21+
import io.microsphere.spring.beans.BeanUtils;
22+
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
2123
import org.springframework.context.ApplicationContextInitializer;
2224
import org.springframework.context.ConfigurableApplicationContext;
2325
import org.springframework.core.env.ConfigurableEnvironment;
2426

2527
import static io.microsphere.constants.PropertyConstants.ENABLED_PROPERTY_NAME;
2628
import static io.microsphere.constants.SymbolConstants.DOT;
2729
import static io.microsphere.logging.LoggerFactory.getLogger;
30+
import static io.microsphere.spring.beans.BeanUtils.generateBeanName;
31+
import static io.microsphere.spring.beans.factory.support.BeanRegistrar.registerBean;
2832
import static io.microsphere.spring.constants.PropertyConstants.APPLICATION_CONTEXT_INITIALIZER_PROPERTY_NAME_PREFIX;
2933

3034
/**
31-
* Abstract class of {@link ApplicationContextInitializer} for {@link ConfigurableApplicationContext}, which can be
32-
* enabled or disabled by configuration properties.
35+
* An abstract base class for {@link ApplicationContextInitializer} implementations targeting {@link ConfigurableApplicationContext}.
36+
* It provides built-in support for enabling or disabling the initializer via configuration properties,
37+
* as well as automatic self-registration into the Spring context.
38+
*
39+
* <h3>Example Usage</h3>
40+
* <pre>{@code
41+
* public class MyCustomInitializer extends ConfigurableApplicationContextInitializer {
42+
*
43+
* @Override
44+
* protected void initialize(ConfigurableApplicationContext context, ConfigurableEnvironment environment) {
45+
* // Perform custom initialization logic here
46+
* }
47+
* }
48+
* }</pre>
49+
*
50+
* <p>By default, this initializer is enabled. To disable it, set the corresponding property to {@code false}:
51+
* <pre>
52+
* microsphere.spring.context-initializer.myCustomInitializer.enabled=false
53+
* </pre>
3354
*
3455
* @author <a href="mailto:mercyblitz@gmail.com">Mercy</a>
3556
* @see ApplicationContextInitializer
@@ -41,15 +62,23 @@ public abstract class ConfigurableApplicationContextInitializer implements Appli
4162

4263
protected final Logger logger = getLogger(getClass());
4364

65+
private String beanName;
66+
4467
@Override
4568
public final void initialize(ConfigurableApplicationContext context) {
4669
ConfigurableEnvironment environment = context.getEnvironment();
47-
if (isEnabled(context, environment)) {
48-
initialize(context, environment);
70+
if (!isEnabled(context, environment)) {
71+
logger.info("The {} was disabled, if it needs to be enabled, please set the property '{}' to 'true' .",
72+
getClass(), getEnabledPropertyName());
73+
return;
74+
}
75+
if (isRegistered(context)) {
76+
logger.info("Current {} Bean[name : '{}'] is already registered to the Spring Context[id : '{}'] , so it will not be initialized.",
77+
getClass(), getBeanName(), context.getId());
4978
return;
5079
}
51-
logger.info("The {} was disabled, if it needs to be enabled, please set the property '{}' to 'true' .",
52-
getClass(), getEnabledPropertyName());
80+
initialize(context, environment);
81+
registerSelf(context);
5382
}
5483

5584
/**
@@ -66,6 +95,8 @@ public final void initialize(ConfigurableApplicationContext context) {
6695
* @param context the {@link ConfigurableApplicationContext}
6796
* @param environment the {@link ConfigurableEnvironment}
6897
* @return if enabled, return <code>true</code>, or <code>false</code>
98+
* @see #getEnabledPropertyName()
99+
* @see #getDefaultEnabled()
69100
*/
70101
protected boolean isEnabled(ConfigurableApplicationContext context, ConfigurableEnvironment environment) {
71102
String propertyName = getEnabledPropertyName();
@@ -76,10 +107,10 @@ protected boolean isEnabled(ConfigurableApplicationContext context, Configurable
76107
* Get the property name of the enabled
77108
*
78109
* @return the property name of the enabled
110+
* @see #getBeanName()
79111
*/
80112
protected String getEnabledPropertyName() {
81-
String simpleClassName = getClass().getSimpleName();
82-
return APPLICATION_CONTEXT_INITIALIZER_PROPERTY_NAME_PREFIX + simpleClassName + DOT + ENABLED_PROPERTY_NAME;
113+
return APPLICATION_CONTEXT_INITIALIZER_PROPERTY_NAME_PREFIX + getBeanName() + DOT + ENABLED_PROPERTY_NAME;
83114
}
84115

85116
/**
@@ -91,4 +122,39 @@ protected String getEnabledPropertyName() {
91122
protected boolean getDefaultEnabled() {
92123
return true;
93124
}
125+
126+
/**
127+
* Get the bean name of this {@link ConfigurableApplicationContextInitializer}
128+
*
129+
* @return the bean name of this {@link ConfigurableApplicationContextInitializer}
130+
* @see BeanUtils#generateBeanName(Class)
131+
*/
132+
protected String getBeanName() {
133+
String beanName = this.beanName;
134+
if (beanName == null) {
135+
beanName = generateBeanName(getClass());
136+
this.beanName = beanName;
137+
}
138+
return beanName;
139+
}
140+
141+
/**
142+
* Is registered or not
143+
*
144+
* @param context the {@link ConfigurableApplicationContext}
145+
* @return if registered, return <code>true</code>, or <code>false</code>
146+
*/
147+
protected boolean isRegistered(ConfigurableApplicationContext context) {
148+
return context.containsBean(getBeanName());
149+
}
150+
151+
/**
152+
* Register self to the {@link ConfigurableApplicationContext}
153+
*
154+
* @param context the {@link ConfigurableApplicationContext}
155+
*/
156+
protected void registerSelf(ConfigurableApplicationContext context) {
157+
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
158+
registerBean(beanFactory, getBeanName(), this);
159+
}
94160
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
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+
18+
package io.microsphere.spring.context.annotation;
19+
20+
import io.microsphere.spring.context.ConfigurableApplicationContextInitializer;
21+
import io.microsphere.spring.context.config.AutoRegistrationBean;
22+
import org.springframework.context.ApplicationContextInitializer;
23+
import org.springframework.context.ConfigurableApplicationContext;
24+
import org.springframework.core.env.ConfigurableEnvironment;
25+
26+
import static io.microsphere.spring.beans.factory.support.BeanRegistrar.registerBeanDefinition;
27+
import static io.microsphere.spring.constants.PropertyConstants.DEFAULT_AUTO_REGISTERED_VALUE;
28+
import static io.microsphere.spring.context.annotation.EnableAutoRegistrationBean.BEANS_AUTO_REGISTERED_PROEPRTY_NAME;
29+
30+
/**
31+
* {@link ApplicationContextInitializer} class for {@link AutoRegistrationBean}
32+
*
33+
* @author <a href="mailto:mercyblitz@gmail.com">Mercy</a>
34+
* @see EnableAutoRegistrationBean
35+
* @see AutoRegistrationBean
36+
* @since 1.0.0
37+
*/
38+
public class AutoRegistrationBeanInitializer extends ConfigurableApplicationContextInitializer {
39+
40+
@Override
41+
protected void initialize(ConfigurableApplicationContext context, ConfigurableEnvironment environment) {
42+
registerBeanDefinition(context.getBeanFactory(), Config.class);
43+
}
44+
45+
@EnableAutoRegistrationBean
46+
static class Config {
47+
}
48+
49+
@Override
50+
protected String getEnabledPropertyName() {
51+
return BEANS_AUTO_REGISTERED_PROEPRTY_NAME;
52+
}
53+
54+
@Override
55+
protected boolean getDefaultEnabled() {
56+
return DEFAULT_AUTO_REGISTERED_VALUE;
57+
}
58+
}

microsphere-spring-context/src/main/resources/META-INF/spring.factories

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ io.microsphere.spring.beans.factory.annotation.ResourceInjectionPointDependencyR
66

77
# ApplicationContextInitializer
88
org.springframework.context.ApplicationContextInitializer=\
9+
io.microsphere.spring.context.annotation.AutoRegistrationBeanInitializer,\
910
io.microsphere.spring.context.event.EventPublishingBeanInitializer,\
1011
io.microsphere.spring.beans.factory.support.ListenableAutowireCandidateResolverInitializer,\
1112
io.microsphere.spring.core.env.ListenableConfigurableEnvironmentInitializer

microsphere-spring-context/src/test/java/io/microsphere/spring/beans/BeanSourceTest.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,17 +92,16 @@ public void testRegisterBeansOnStatic() {
9292

9393
testInSpringContainer(context -> {
9494
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
95-
BeanDefinitionRegistry registry = asBeanDefinitionRegistry(beanFactory);
96-
Map<Class<?>, String> beanTypesAndNames = registerBeans(registry, ofArray(BEAN_FACTORY), User.class);
95+
Map<Class<?>, String> beanTypesAndNames = registerBeans(beanFactory, ofArray(BEAN_FACTORY), User.class);
9796
assertBeans(beanTypesAndNames);
9897

99-
beanTypesAndNames = registerBeans(registry, ofArray(BEAN_FACTORY, SPRING_FACTORIES), User.class);
98+
beanTypesAndNames = registerBeans(beanFactory, ofArray(BEAN_FACTORY, SPRING_FACTORIES), User.class);
10099
assertBeans(beanTypesAndNames);
101100

102-
beanTypesAndNames = registerBeans(registry, ofArray(BEAN_FACTORY, SPRING_FACTORIES, JAVA_SERVICE_PROVIDER), User.class);
101+
beanTypesAndNames = registerBeans(beanFactory, ofArray(BEAN_FACTORY, SPRING_FACTORIES, JAVA_SERVICE_PROVIDER), User.class);
103102
assertBeans(beanTypesAndNames);
104103

105-
beanTypesAndNames = registerBeans(registry, values());
104+
beanTypesAndNames = registerBeans(beanFactory, values());
106105
assertSame(emptyMap(), beanTypesAndNames);
107106
}, User.class);
108107
}

0 commit comments

Comments
 (0)