Spring bean静态注入的解决方案(附代码)
笔者在做代码重构时,遇到这样的一个问题,觉得对于不熟悉Spring框架的同学来说,还是很有学习意义的,特记录在此。 场景是这样的:需要一个Dto2VoFactory的类,该类有一个静态属性factorys,该属性需要存储一些业务渲染模版类的具体实现,以便后续调用。 如果按照普通的bean注入的方式,@Autowired,毫无疑问会报空指针,因为正常的bean注入方式不支持静态属性。所以,笔者查阅了一些资料,自己实现一个Spring bean的静态注入,代码很简单,如下:
/** * @author mayan * @create 2019-11-14 * @decription Spring静态注入 */ public class SpringBeanUtil implements ApplicationContextAware { private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { SpringBeanUtil.applicationContext = applicationContext; } public static <T> T getBean(Class<T> clazz) { return applicationContext.getBean(clazz); } public static Object getBean(String name) throws BeansException { return applicationContext.getBean(name); } }
此外,还需要在application-context.xml的配置文件中添加如下配置,用于创建上述类的实例:
<bean id="springBeanFactory" class="com.facishare.feeds.biz.bean.SpringBeanUtil"/>
下面是我在项目中的使用方式:
/** * @author mayan * @create 2019-10-31 * @decription */ public class Dto2VoClientFactory implements Dto2VoFactory { private static Map<String, FeedParser<FeedVO>> factorys = new HashMap<>(); static { factorys.put("MobileDetail", SpringBeanUtil.getBean(MobileDetailFeedVOParser.class)); factorys.put("MobileList", SpringBeanUtil.getBean(MobileListFeedVOParser.class)); factorys.put("WEB", SpringBeanUtil.getBean(WebFeedVOParser.class)); factorys.put("PRMWebList", SpringBeanUtil.getBean(PrmWebListFeedVOParser.class)); factorys.put("PRMWebDetail", SpringBeanUtil.getBean(PrmWebDetailFeedVOParser.class)); factorys.put("PRMMobileDetail", SpringBeanUtil.getBean(PrmMobileDetailFeedVOParser.class)); factorys.put("PRMMobileList", SpringBeanUtil.getBean(PrmMobileListFeedVOParser.class)); } public static FeedParser<FeedVO> getRenderFactory(FeedClientRender clientRender) { return factorys.getOrDefault(clientRender.getClient(), new WebFeedVOParser()); } }
经测试,完全符合需求,可以解决bean静态注入的问题.