基于SpringIOC容器的工厂模式

背景:最近做了一个项目,平台适配多个三方广告商(app内部广告位),平台发出广告位大小、类型请求,三方接口返回广告。

为了满足不断增长的三方广告商(接口规格都不一样),我们在实现的时候采用工厂模式来进行适配。这也是我第一次在实战中使用工厂模式,感觉扩展性得到了很大的加强。

原理:基于Spring的ApplicationContextAware接口实现setApplicationContext方法。

源代码地址https://github.com/qycwudi/rocketMQObject/tree/dev/1.0.0/design_patterns8092

 

beanName存储:数据库存放三方广告商基本信息,包括后台实现的bean。

实现时序图

 

通过实现 setApplicationContext方法来根据name获取bean实例。

@Component
public class SpringIOCUtil implements ApplicationContextAware {
    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("===setApplicationContext===");
        SpringIOCUtil.applicationContext = applicationContext;
    }

    public Object getBean(String beanName) {
        Object object = null;
        try {
            object = applicationContext.getBean(beanName);
        } catch (Exception e) {
            System.out.println("没有找到");
        } finally {
            return object;
        }
    }
}

获取bean方法 

public class FactoryMethod {
    public static FactoryMethods init(String beanName){
        SpringIOCUtil springIOCUtil = new SpringIOCUtil();
        return (FactoryMethods)springIOCUtil.getBean(beanName);
    }
}

service层

@Service
public class FactoryService extends ServiceImpl<FactoryMapper, FactoryInfo> {
    public String operate(String id){
        FactoryInfo factoryPojo = baseMapper.selectById(id);
        if(factoryPojo==null){
            return "没有记录";
        }
        FactoryMethods factoryMethods = FactoryMethod.init(factoryPojo.getBeanName());
        try {
            return factoryMethods.todo();
        }catch (Exception e){
            return "执行方法错误";
        }
    }
}

 工厂接口

public interface FactoryMethods {
    /**
     * 工厂方法
    */
    String todo();
}

后续扩展:

只需要继承FactoryMethods方法,实现todo接口来完成接口参数的适配,处理三方接口返回的数据。对数据格式进行统一返回。

DTO参数采用json的格式来进行传递,减少对表字段的修改,只动态添加实体类的字段即可。

JSONObject jsonObject = JSONUtil.parseObj(json);
jsonObject.get("id")

ApplicationContextAware底层原理

https://www.jianshu.com/p/4c0723615a52

https://www.jianshu.com/p/22e7fba07ce7

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值