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静态注入的问题.
