Skip to content

Commit 4d33832

Browse files
committed
Support EnvironmentAware ImportSelector/Registrar
Add support for the EnvironmentAware interface with ImportSelector and ImportBeanDefinitionRegistrar implementations. Issue: SPR-10602
1 parent d7ec20a commit 4d33832

File tree

5 files changed

+92
-16
lines changed

5 files changed

+92
-16
lines changed

spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import org.springframework.beans.factory.support.BeanDefinitionReader;
4848
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
4949
import org.springframework.beans.factory.support.BeanNameGenerator;
50+
import org.springframework.context.EnvironmentAware;
5051
import org.springframework.context.ResourceLoaderAware;
5152
import org.springframework.core.NestedIOException;
5253
import org.springframework.core.annotation.AnnotationAttributes;
@@ -486,6 +487,9 @@ private boolean checkAssignability(Class<?> clazz, Object candidate) throws IOEx
486487
*/
487488
private void invokeAwareMethods(Object importStrategyBean) {
488489
if (importStrategyBean instanceof Aware) {
490+
if (importStrategyBean instanceof EnvironmentAware) {
491+
((EnvironmentAware) importStrategyBean).setEnvironment(this.environment);
492+
}
489493
if (importStrategyBean instanceof ResourceLoaderAware) {
490494
((ResourceLoaderAware) importStrategyBean).setResourceLoader(this.resourceLoader);
491495
}

spring-context/src/main/java/org/springframework/context/annotation/ImportBeanDefinitionRegistrar.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2012 the original author or authors.
2+
* Copyright 2002-2013 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -33,6 +33,7 @@
3333
* {@link org.springframework.beans.factory.Aware Aware} interfaces, and their respective
3434
* methods will be called prior to {@link #registerBeanDefinitions}:
3535
* <ul>
36+
* <li>{@link org.springframework.context.EnvironmentAware}</li>
3637
* <li>{@link org.springframework.beans.factory.BeanFactoryAware BeanFactoryAware}
3738
* <li>{@link org.springframework.beans.factory.BeanClassLoaderAware BeanClassLoaderAware}
3839
* <li>{@link org.springframework.context.ResourceLoaderAware ResourceLoaderAware}

spring-context/src/main/java/org/springframework/context/annotation/ImportSelector.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
* {@link org.springframework.beans.factory.Aware Aware} interfaces, and their respective
2828
* methods will be called prior to {@link #selectImports}:
2929
* <ul>
30+
* <li>{@link org.springframework.context.EnvironmentAware}</li>
3031
* <li>{@link org.springframework.beans.factory.BeanFactoryAware BeanFactoryAware}</li>
3132
* <li>{@link org.springframework.beans.factory.BeanClassLoaderAware BeanClassLoaderAware}</li>
3233
* <li>{@link org.springframework.context.ResourceLoaderAware ResourceLoaderAware}</li>

spring-context/src/test/java/org/springframework/context/annotation/ImportBeanDefinitionRegistrarTests.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2012 the original author or authors.
2+
* Copyright 2002-2013 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -16,26 +16,27 @@
1616

1717
package org.springframework.context.annotation;
1818

19-
import static org.hamcrest.CoreMatchers.*;
20-
import static org.junit.Assert.*;
21-
2219
import java.lang.annotation.ElementType;
2320
import java.lang.annotation.Retention;
2421
import java.lang.annotation.RetentionPolicy;
2522
import java.lang.annotation.Target;
2623

2724
import org.junit.Test;
28-
2925
import org.springframework.beans.BeansException;
3026
import org.springframework.beans.factory.BeanClassLoaderAware;
3127
import org.springframework.beans.factory.BeanFactory;
3228
import org.springframework.beans.factory.BeanFactoryAware;
3329
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
30+
import org.springframework.context.EnvironmentAware;
3431
import org.springframework.context.MessageSource;
3532
import org.springframework.context.ResourceLoaderAware;
33+
import org.springframework.core.env.Environment;
3634
import org.springframework.core.io.ResourceLoader;
3735
import org.springframework.core.type.AnnotationMetadata;
3836

37+
import static org.hamcrest.CoreMatchers.*;
38+
import static org.junit.Assert.*;
39+
3940
/**
4041
* Integration tests for {@link ImportBeanDefinitionRegistrar}.
4142
*
@@ -53,6 +54,7 @@ public void shouldInvokeAwareMethodsInImportBeanDefinitionRegistrar() {
5354
assertThat(SampleRegistrar.beanFactory, is((BeanFactory) context.getBeanFactory()));
5455
assertThat(SampleRegistrar.classLoader, is(context.getBeanFactory().getBeanClassLoader()));
5556
assertThat(SampleRegistrar.resourceLoader, is(notNullValue()));
57+
assertThat(SampleRegistrar.environment, is((Environment) context.getEnvironment()));
5658
}
5759

5860
@Sample
@@ -69,11 +71,12 @@ static class Config {
6971
}
7072

7173
static class SampleRegistrar implements ImportBeanDefinitionRegistrar, BeanClassLoaderAware, ResourceLoaderAware,
72-
BeanFactoryAware {
74+
BeanFactoryAware, EnvironmentAware {
7375

7476
static ClassLoader classLoader;
7577
static ResourceLoader resourceLoader;
7678
static BeanFactory beanFactory;
79+
static Environment environment;
7780

7881
@Override
7982
public void setBeanClassLoader(ClassLoader classLoader) {
@@ -90,6 +93,11 @@ public void setResourceLoader(ResourceLoader resourceLoader) {
9093
SampleRegistrar.resourceLoader = resourceLoader;
9194
}
9295

96+
@Override
97+
public void setEnvironment(Environment environment) {
98+
SampleRegistrar.environment = environment;
99+
}
100+
93101
@Override
94102
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
95103
}

spring-context/src/test/java/org/springframework/context/annotation/ImportSelectorTests.java

Lines changed: 71 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,24 +16,34 @@
1616

1717
package org.springframework.context.annotation;
1818

19-
import static org.mockito.Matchers.any;
20-
import static org.mockito.Matchers.eq;
21-
import static org.mockito.Mockito.inOrder;
22-
import static org.mockito.Mockito.spy;
23-
2419
import java.lang.annotation.ElementType;
2520
import java.lang.annotation.Retention;
2621
import java.lang.annotation.RetentionPolicy;
2722
import java.lang.annotation.Target;
2823

2924
import org.junit.Test;
3025
import org.mockito.InOrder;
26+
import org.springframework.beans.BeansException;
27+
import org.springframework.beans.factory.BeanClassLoaderAware;
28+
import org.springframework.beans.factory.BeanFactory;
29+
import org.springframework.beans.factory.BeanFactoryAware;
3130
import org.springframework.beans.factory.config.BeanDefinition;
3231
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
32+
import org.springframework.context.EnvironmentAware;
33+
import org.springframework.context.MessageSource;
34+
import org.springframework.context.ResourceLoaderAware;
35+
import org.springframework.context.annotation.ImportBeanDefinitionRegistrarTests.SampleRegistrar;
3336
import org.springframework.core.Ordered;
3437
import org.springframework.core.annotation.Order;
38+
import org.springframework.core.env.Environment;
39+
import org.springframework.core.io.ResourceLoader;
3540
import org.springframework.core.type.AnnotationMetadata;
3641

42+
import static org.hamcrest.CoreMatchers.*;
43+
import static org.junit.Assert.*;
44+
import static org.mockito.Matchers.*;
45+
import static org.mockito.Mockito.*;
46+
3747
/**
3848
* Tests for {@link ImportSelector} and {@link DeferredImportSelector}.
3949
*
@@ -50,10 +60,62 @@ public void importSelectors() {
5060
context.refresh();
5161
context.getBean(Config.class);
5262
InOrder ordered = inOrder(beanFactory);
53-
ordered.verify(beanFactory).registerBeanDefinition(eq("a"), any(BeanDefinition.class));
54-
ordered.verify(beanFactory).registerBeanDefinition(eq("b"), any(BeanDefinition.class));
55-
ordered.verify(beanFactory).registerBeanDefinition(eq("d"), any(BeanDefinition.class));
56-
ordered.verify(beanFactory).registerBeanDefinition(eq("c"), any(BeanDefinition.class));
63+
ordered.verify(beanFactory).registerBeanDefinition(eq("a"), (BeanDefinition) anyObject());
64+
ordered.verify(beanFactory).registerBeanDefinition(eq("b"), (BeanDefinition) anyObject());
65+
ordered.verify(beanFactory).registerBeanDefinition(eq("d"), (BeanDefinition) anyObject());
66+
ordered.verify(beanFactory).registerBeanDefinition(eq("c"), (BeanDefinition) anyObject());
67+
}
68+
69+
@Test
70+
public void invokeAwareMethodsInImportSelector() {
71+
72+
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AwareConfig.class);
73+
context.getBean(MessageSource.class);
74+
75+
assertThat(SampleRegistrar.beanFactory, is((BeanFactory) context.getBeanFactory()));
76+
assertThat(SampleRegistrar.classLoader, is(context.getBeanFactory().getBeanClassLoader()));
77+
assertThat(SampleRegistrar.resourceLoader, is(notNullValue()));
78+
assertThat(SampleRegistrar.environment, is((Environment) context.getEnvironment()));
79+
}
80+
81+
@Configuration
82+
@Import(SampleImportSelector.class)
83+
static class AwareConfig {
84+
85+
}
86+
87+
static class SampleImportSelector implements ImportSelector, BeanClassLoaderAware, ResourceLoaderAware,
88+
BeanFactoryAware, EnvironmentAware {
89+
90+
static ClassLoader classLoader;
91+
static ResourceLoader resourceLoader;
92+
static BeanFactory beanFactory;
93+
static Environment environment;
94+
95+
@Override
96+
public void setBeanClassLoader(ClassLoader classLoader) {
97+
SampleRegistrar.classLoader = classLoader;
98+
}
99+
100+
@Override
101+
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
102+
SampleRegistrar.beanFactory = beanFactory;
103+
}
104+
105+
@Override
106+
public void setResourceLoader(ResourceLoader resourceLoader) {
107+
SampleRegistrar.resourceLoader = resourceLoader;
108+
}
109+
110+
@Override
111+
public void setEnvironment(Environment environment) {
112+
SampleRegistrar.environment = environment;
113+
}
114+
115+
@Override
116+
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
117+
return new String[] {};
118+
}
57119
}
58120

59121
@Sample

0 commit comments

Comments
 (0)