Skip to content

Commit c215b9d

Browse files
authored
Merge pull request #3 from prchen/release
Release 0.0.2
2 parents 6273620 + 6b656ef commit c215b9d

File tree

17 files changed

+92
-66
lines changed

17 files changed

+92
-66
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ Antares is an SpringBoot extension used to simplify the process of dynamically r
88
<dependency>
99
<groupId>com.github.prchen</groupId>
1010
<artifactId>spring-boot-starter-antares</artifactId>
11-
<version>0.0.1</version>
11+
<version>0.0.2</version>
1212
</dependency>
1313
```
1414

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
<groupId>com.github.prchen</groupId>
1212
<artifactId>spring-boot-starter-antares</artifactId>
13-
<version>0.0.1</version>
13+
<version>0.0.2</version>
1414
<packaging>jar</packaging>
1515

1616
<name>Antares</name>
@@ -63,7 +63,7 @@
6363
<dependency>
6464
<groupId>org.springframework.boot</groupId>
6565
<artifactId>spring-boot-starter</artifactId>
66-
<scope>compile</scope>
66+
<scope>provided</scope>
6767
</dependency>
6868
<dependency>
6969
<groupId>org.springframework.boot</groupId>

src/main/java/com/github/prchen/antares/starter/AntaresFactoryBean.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public abstract class AntaresFactoryBean implements FactoryBean<Object> {
2929
* @param objectType Bean type
3030
*/
3131
public final void setObjectType(Class<?> objectType) {
32-
if (this.objectType != null) {
32+
if (this.objectType != null && this.objectType != objectType) {
3333
throw new IllegalStateException("objectType already set");
3434
}
3535
this.objectType = objectType;
@@ -39,8 +39,8 @@ public final void setObjectType(Class<?> objectType) {
3939
* Get the bean type
4040
* @return Bean type
4141
*/
42-
@Nullable
4342
@Override
43+
@Nullable
4444
public final Class<?> getObjectType() {
4545
return objectType;
4646
}

src/main/java/com/github/prchen/antares/starter/AntaresRegistry.java

Lines changed: 37 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
3232
import org.springframework.core.Ordered;
3333
import org.springframework.core.PriorityOrdered;
34+
import org.springframework.core.annotation.AnnotationUtils;
3435
import org.springframework.core.type.filter.AnnotationTypeFilter;
3536
import org.springframework.core.type.filter.AssignableTypeFilter;
3637
import org.springframework.stereotype.Component;
@@ -82,7 +83,7 @@ public void postProcessBeanFactory(ConfigurableListableBeanFactory factory) thro
8283
@Override
8384
public Set<Class<?>> getManifest(Class<? extends Annotation> advice) {
8485
return manifest.stream()
85-
.filter(x -> x.getAnnotation(advice) != null)
86+
.filter(x -> AnnotationUtils.findAnnotation(x, advice) != null)
8687
.collect(Collectors.toSet());
8788
}
8889

@@ -96,7 +97,7 @@ private void initBasePackages(BeanDefinitionRegistry registry) {
9697
if (className != null) {
9798
try {
9899
Class<?> clazz = Class.forName(className);
99-
if (clazz.getAnnotation(AntaresScan.class) != null) {
100+
if (AnnotationUtils.findAnnotation(clazz, AntaresScan.class) != null) {
100101
result.add(clazz.getPackage().getName());
101102
}
102103
} catch (ClassNotFoundException e) {
@@ -114,31 +115,48 @@ private void initBasePackages(BeanDefinitionRegistry registry) {
114115

115116
@SuppressWarnings("unchecked")
116117
private void initManifestAdvises() {
117-
Set<Class<?>> types = new CandidateScanner(
118-
Collections.singletonList(Annotation.class),
119-
Collections.singletonList(AntaresManifestAdvice.class))
120-
.scanTypes();
118+
CandidateScanner scanner = new CandidateScanner();
119+
AssignableTypeFilter classFilter = new AssignableTypeFilter(Annotation.class);
120+
AnnotationTypeFilter metaFilter = new AnnotationTypeFilter(AntaresManifestAdvice.class);
121+
scanner.addIncludeFilter((x, y) -> classFilter.match(x, y) && metaFilter.match(x, y));
122+
Set<Class<?>> types = scanner.scanTypes();
121123
manifestAdvices = types.stream()
122124
.map(x -> (Class<? extends Annotation>) x)
123125
.collect(Collectors.toList())
124126
.toArray(new Class[0]);
127+
if (manifestAdvices.length > 0) {
128+
String manifest = String.join(", ", Arrays.stream(manifestAdvices)
129+
.map(Class::getName)
130+
.collect(Collectors.toList()));
131+
logger.info("Antares ManifestAdvice: " + manifest);
132+
} else {
133+
logger.info("No ManifestAdvice detected");
134+
}
125135
}
126136

127137
private void initFactories(BeanDefinitionRegistry registry) {
128138
for (Class<? extends Annotation> advise : manifestAdvices) {
129-
Class<?> factoryClass = advise.getAnnotation(AntaresManifestAdvice.class).factoryClass();
130-
if (factoryClass != AntaresFactoryBean.class) {
131-
logger.info("Loading factory: " + factoryClass.getName());
132-
new DefinitionScanner(registry, advise).scan(basePackages);
139+
AntaresManifestAdvice meta = AnnotationUtils.findAnnotation(advise, AntaresManifestAdvice.class);
140+
if (meta == null) {
141+
logger.info("Skipping AntaresManifestAdvice due to unexpected reflection failure: " + advise.getName());
142+
} else {
143+
Class<?> factoryClass = meta.factoryClass();
144+
if (factoryClass != AntaresFactoryBean.class) {
145+
logger.info("Loading factory: " + factoryClass.getName());
146+
new DefinitionScanner(registry, advise).scan(basePackages);
147+
}
133148
}
134149
}
135150
}
136151

137152
private void initManifest() {
138-
manifest = new CandidateScanner(
139-
Collections.emptyList(),
140-
Arrays.asList(manifestAdvices))
141-
.scanTypes();
153+
CandidateScanner scanner = new CandidateScanner();
154+
for (Class<? extends Annotation> advice : manifestAdvices) {
155+
scanner.addIncludeFilter(new AnnotationTypeFilter(advice, false));
156+
}
157+
manifest = scanner.scanTypes().stream()
158+
.filter(x -> !x.isAnnotation())
159+
.collect(Collectors.toSet());
142160
if (manifest.size() > 0) {
143161
String manifest = String.join(", ", this.manifest.stream()
144162
.map(Class::getName)
@@ -152,11 +170,12 @@ private void initManifest() {
152170
class DefinitionScanner extends ClassPathBeanDefinitionScanner {
153171
private Class<?> factory;
154172

173+
@SuppressWarnings("all")
155174
private DefinitionScanner(BeanDefinitionRegistry registry, Class<? extends Annotation> advise) {
156175
super(registry, false);
157176
super.setResourceLoader(context);
158177
super.setBeanNameGenerator((d, r) -> StringUtils.uncapitalize(d.getBeanClassName()));
159-
this.factory = advise.getAnnotation(AntaresManifestAdvice.class).factoryClass();
178+
this.factory = AnnotationUtils.findAnnotation(advise, AntaresManifestAdvice.class).factoryClass();
160179
addIncludeFilter(new AnnotationTypeFilter(advise, false));
161180
}
162181

@@ -180,6 +199,7 @@ protected Set<BeanDefinitionHolder> doScan(String... basePackages) {
180199
beanDefinition.getPropertyValues().add("objectType", beanClass);
181200
} catch (ClassNotFoundException e) {
182201
AntaresRegistry.this.logger.warn("Failed to load class: " + className);
202+
beanDefinitions.remove(definition);
183203
}
184204
}
185205
return beanDefinitions;
@@ -189,14 +209,8 @@ protected Set<BeanDefinitionHolder> doScan(String... basePackages) {
189209

190210
class CandidateScanner extends ClassPathScanningCandidateComponentProvider {
191211

192-
private CandidateScanner(List<Class<?>> types, List<Class<? extends Annotation>> annotations) {
212+
private CandidateScanner() {
193213
super(false);
194-
for (Class<?> type : types) {
195-
addIncludeFilter(new AssignableTypeFilter(type));
196-
}
197-
for (Class<? extends Annotation> annotation : annotations) {
198-
addIncludeFilter(new AnnotationTypeFilter(annotation, false));
199-
}
200214
}
201215

202216
@Override
@@ -206,7 +220,7 @@ protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) {
206220
beanDefinition.getMetadata().isIndependent());
207221
}
208222

209-
Set<Class<?>> scanTypes() {
223+
private Set<Class<?>> scanTypes() {
210224
Set<String> classNames = new HashSet<>();
211225
for (String basePackage : basePackages) {
212226
findCandidateComponents(basePackage).stream()

src/test/java/com/github/prchen/test/antares/starter/classes/BarCandidate1.java

Lines changed: 0 additions & 7 deletions
This file was deleted.

src/test/java/com/github/prchen/test/antares/starter/classes/BarCandidate2.java

Lines changed: 0 additions & 7 deletions
This file was deleted.

src/test/java/com/github/prchen/test/antares/starter/interfaces/FooInterface.java

Lines changed: 0 additions & 10 deletions
This file was deleted.

src/test/java/com/github/prchen/test/antares/starter/TestApp.java renamed to src/test/java/test/TestApp.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.github.prchen.test.antares.starter;
1+
package test;
22

33
import com.github.prchen.antares.starter.AntaresScan;
44
import org.springframework.boot.SpringApplication;
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
package com.github.prchen.test.antares.starter;
1+
package test;
22

33
import com.github.prchen.antares.starter.AntaresContext;
4-
import com.github.prchen.test.antares.starter.annotations.Bar;
5-
import com.github.prchen.test.antares.starter.annotations.Foo;
6-
import com.github.prchen.test.antares.starter.classes.BarCandidate1;
7-
import com.github.prchen.test.antares.starter.classes.BarCandidate2;
8-
import com.github.prchen.test.antares.starter.interfaces.FooInterface;
4+
import test.annotations.Bar;
5+
import test.annotations.Foo;
6+
import test.classes.BarCandidate1;
7+
import test.classes.BarCandidate2;
8+
import test.interfaces.FooInterface;
99
import org.junit.Assert;
1010
import org.junit.Test;
1111
import org.junit.runner.RunWith;
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package test.annotations;
2+
3+
import java.lang.annotation.ElementType;
4+
import java.lang.annotation.Retention;
5+
import java.lang.annotation.RetentionPolicy;
6+
import java.lang.annotation.Target;
7+
8+
@Target({ElementType.TYPE})
9+
@Retention(RetentionPolicy.RUNTIME)
10+
@BarMeta
11+
public @interface Bar {
12+
}
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.github.prchen.test.antares.starter.annotations;
1+
package test.annotations;
22

33
import com.github.prchen.antares.starter.AntaresManifestAdvice;
44

@@ -7,8 +7,8 @@
77
import java.lang.annotation.RetentionPolicy;
88
import java.lang.annotation.Target;
99

10-
@Target({ElementType.TYPE})
10+
@Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE})
1111
@Retention(RetentionPolicy.RUNTIME)
1212
@AntaresManifestAdvice
13-
public @interface Bar {
13+
public @interface BarMeta {
1414
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
package com.github.prchen.test.antares.starter.annotations;
1+
package test.annotations;
22

33
import com.github.prchen.antares.starter.AntaresManifestAdvice;
4-
import com.github.prchen.test.antares.starter.factories.FooFactoryBean;
4+
import test.factories.FooFactoryBean;
55

66
import java.lang.annotation.ElementType;
77
import java.lang.annotation.Retention;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package test.classes;
2+
3+
import test.annotations.Bar;
4+
5+
@Bar
6+
public class BarCandidate1 {
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package test.classes;
2+
3+
import test.annotations.Bar;
4+
5+
@Bar
6+
public class BarCandidate2 {
7+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.github.prchen.test.antares.starter.factories;
1+
package test.factories;
22

33
import com.github.prchen.antares.starter.AntaresFactoryBean;
44
import org.springframework.lang.Nullable;
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package test.interfaces;
2+
3+
import test.annotations.Foo;
4+
5+
@Foo
6+
public interface FooInterface {
7+
8+
String sayHi();
9+
10+
}

src/test/resources/logback-test.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
</appender>
1010

1111
<logger name="org.neetfx.antares" level="INFO"/>
12-
<logger name="org.neetfx.test.antares" level="INFO"/>
12+
<logger name="test" level="INFO"/>
1313

1414
<root level="WARN">
1515
<appender-ref ref="STDOUT" />

0 commit comments

Comments
 (0)