【问题标题】:Spring-Boot: Create instances of custom annoated classesSpring-Boot:创建自定义注释类的实例
【发布时间】:2021-12-09 00:53:07
【问题描述】:

对于一个项目,我正在尝试收集特定自定义注释的所有类并创建它的实例。或者使用在其上下文中创建的 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);
     }
}

我不确定要在哪里以及寻找什么来实现这一目标。或者,如果有可能的话。

【问题讨论】:

  • 这是否意味着我需要用 @Bean 注释 Package1ImplPackage2Impl ?但是 Bean 是应用在方法上的,对吧?
  • 它们已经被 Spring 管理了,对吧?我的意思是他们有 @Componenet 的注释或只是您的自定义注释?
  • 目前只是自定义的。
  • 添加 @Component 注释,以便它们由 Spring 管理。然后从ApplicationContext 你可以得到所有的bean,甚至是来自注解的特定bean。试试吧,我会为你的问题写一个答案。

标签: java spring spring-boot annotations java-11


【解决方案1】:

对此有解决方案。

添加 @Component 注释,以便您的类由 Spring 管理。然后从ApplicationContext,您可以从带有getBeansWithAnnotation 的注释中获取所有bean 甚至特定bean。

例子

Map<String,Object> beans = applicationContext.getBeansWithAnnotation(Foo.class);

【讨论】:

  • 是否可以在 @Service 类中注入 ApplicationContext?
  • 是的@Autowired private ApplicationContext applicationContext;
  • 抛出 NPE。我需要做些什么才能访问 ApplicationContext?
  • 它必须在构造函数中自动装配,而不是作为类变量。无论如何,谢谢你
  • 哦,好吧,我刚开了个聊天室,哈哈。没关系,我很高兴能帮上忙
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-07
  • 2019-03-15
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多