将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>
你完成了!