对于一个项目,我试图收集特定自定义注释的所有类,并创建它的实例。或者使用在其上下文中创建的Spring Boot实例。
这是自定义注释:
public @interface MyAnnotation {
String name();
}
以下是在各种包中使用此注释的类:
在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
在我的服务类中:MyAnnotationService.java
:
@Service
@Singleton
class MyAnnotationService {
public MyAnnotationService() {
List<String> classNamesToLoad = SpringSomething.findWithAnnotation(MyAnnotation.class);
for (String cls : classNamesToLoad) {
createNewInstance(cls);
}
}
}
Option#2
在我的服务类中:MyAnnotationService.java
:
@Service
@Singleton
class MyAnnotationService {
public MyAnnotationService() {
Map<String, Object> objectsCreatedBySpring = SpringSomething.findWithAnnotation(MyAnnotation.class);
}
}
我不确定在哪里以及用什么来实现这一目标。或者如果可能的话。
有一个解决方案。
添加@Component
注释,以便您的类由Spring管理。然后,从ApplicationContext
,您可以使用getBeansWithAnnotation从注释中获取所有bean,甚至特定的bean。
示例
Map<String,Object> beans = applicationContext.getBeansWithAnnotation(Foo.class);