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的配置文件中添加如下配置,用于创建上述类的实例:

>

下面是我在项目中的使用方式:

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

你可能感兴趣的:(代码技巧,Spring,bean,静态注入)