Spring-引导:创建自定义注释的实例类
Spring-Boot: Create instances of custom annoated classes
对于一个项目,我试图收集特定自定义注释的所有 classes 并创建它的实例。或者使用 Spring-在其上下文中创建的引导实例。
这是自定义注释:
public @interface MyAnnotation {
String name();
}
以下是 class在各种包中使用此注释的代码:
在com.my.project.package1
@MyAnnotation(name = "package_1_impl")
public class Package1Impl {}
在com.my.project.package2
@MyAnnotation(name = "package_2_impl")
public class Package2mpl {}
现在,我想收集所有这些实现实例并将它们用于例如策略模式。
所以,我想做如下的事情。以下只是我假设存在这样的事情。
Option#1
在我的服务中 class: MyAnnotationService.java
:
@Service
@Singleton
class MyAnnotationService {
public MyAnnotationService() {
List<String> classNamesToLoad = SpringSomething.findWithAnnotation(MyAnnotation.class);
for (String cls : classNamesToLoad) {
createNewInstance(cls);
}
}
}
Option#2
在我的服务中 class: MyAnnotationService.java
:
@Service
@Singleton
class MyAnnotationService {
public MyAnnotationService() {
Map<String, Object> objectsCreatedBySpring = SpringSomething.findWithAnnotation(MyAnnotation.class);
}
}
我不确定要在哪里寻找什么来实现这一点。或者如果可能的话。
有一个解决方案。
添加 @Component
annotation so your classes are managed by Spring. Then from the ApplicationContext
, you can get all the beans and even specific beans from an annotation with getBeansWithAnnotation.
示例
Map<String,Object> beans = applicationContext.getBeansWithAnnotation(Foo.class);
对于一个项目,我试图收集特定自定义注释的所有 classes 并创建它的实例。或者使用 Spring-在其上下文中创建的引导实例。
这是自定义注释:
public @interface MyAnnotation {
String name();
}
以下是 class在各种包中使用此注释的代码:
在com.my.project.package1
@MyAnnotation(name = "package_1_impl")
public class Package1Impl {}
在com.my.project.package2
@MyAnnotation(name = "package_2_impl")
public class Package2mpl {}
现在,我想收集所有这些实现实例并将它们用于例如策略模式。
所以,我想做如下的事情。以下只是我假设存在这样的事情。
Option#1
在我的服务中 class: MyAnnotationService.java
:
@Service
@Singleton
class MyAnnotationService {
public MyAnnotationService() {
List<String> classNamesToLoad = SpringSomething.findWithAnnotation(MyAnnotation.class);
for (String cls : classNamesToLoad) {
createNewInstance(cls);
}
}
}
Option#2
在我的服务中 class: MyAnnotationService.java
:
@Service
@Singleton
class MyAnnotationService {
public MyAnnotationService() {
Map<String, Object> objectsCreatedBySpring = SpringSomething.findWithAnnotation(MyAnnotation.class);
}
}
我不确定要在哪里寻找什么来实现这一点。或者如果可能的话。
有一个解决方案。
添加 @Component
annotation so your classes are managed by Spring. Then from the ApplicationContext
, you can get all the beans and even specific beans from an annotation with getBeansWithAnnotation.
示例
Map<String,Object> beans = applicationContext.getBeansWithAnnotation(Foo.class);