将bean注入枚举

我有DataPrepareService为报表准备数据,我有一个Enum与报表types,我需要注入到Enum的ReportService或从枚举访问ReportService。

我的服务:

@Service public class DataPrepareService { // my service } 

我的枚举:

 public enum ReportType { REPORT_1("name", "filename"), REPORT_2("name", "filename"), REPORT_3("name", "filename") public abstract Map<String, Object> getSpecificParams(); public Map<String, Object> getCommonParams(){ // some code that requires service } } 

我试图使用

 @Autowired DataPrepareService dataPrepareService; 

,但它没有工作

我怎样才能把我的服务注入枚举?

 public enum ReportType { @Component public static class ReportTypeServiceInjector { @Autowired private DataPrepareService dataPrepareService; @PostConstruct public void postConstruct() { for (ReportType rt : EnumSet.allOf(ReportType.class)) rt.setDataPrepareService(dataPrepareService); } } REPORT_1("name", "filename"), REPORT_2("name", "filename"), ... } 

如果您将内部类更改为静态,那么springens可以看到它

也许这样的事情:

 public enum ReportType { @Component public class ReportTypeServiceInjector { @Autowired private DataPrepareService dataPrepareService; @PostConstruct public void postConstruct() { for (ReportType rt : EnumSet.allOf(ReportType.class)) rt.setDataPrepareService(dataPrepareService); } } REPORT_1("name", "filename"), REPORT_2("name", "filename"), ... } 

在enum被实例化的时候,弹簧容器已经启动并运行了(如果你在这个testing用例中有这个types的variables,你的容器通常不会在那里,帮助那里)。 我会build议只是让dataprepare服务或东西给你带有enum参数查找方法的具体参数。

Enum是静态的,所以你必须找出一种方法来从静态的上下文访问bean。

您可以创build一个名为ApplicationContextProvider的类来实现ApplicationContextAware接口。

 import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; public class ApplicationContextProvider implements ApplicationContextAware{ private static ApplicationContext appContext = null; public static ApplicationContext getApplicationContext() { return appContext; } public void setApplicationContext(ApplicationContext appContext) throws BeansException { this.appContext = appContext; } } 

然后添加您的应用程序上下文文件:

 <bean id="applicationContextProvider" class="xxx.xxx.ApplicationContextProvider"></bean> 

之后你可以像这样以静态方式访问应用程序上下文:

 ApplicationContext appContext = ApplicationContextProvider.getApplicationContext(); 

我想这是你所需要的

 public enum MyEnum { ONE,TWO,THREE; } 

按照惯例自动装入枚举

 @Configurable public class MySpringConfiguredClass { @Autowired @Qualifier("mine") private MyEnum myEnum; } 

这里有个技巧,使用factory-method =“valueOf”,并确保lazy-init =“false”

所以容器先创buildbean

 <bean id="mine" class="foo.bar.MyEnum" factory-method="valueOf" lazy-init="false"> <constructor-arg value="ONE" /> </bean> 

你完成了!