Magento 1.7安装amd magento

需求
设计一个分发系统,对视频或图文进行多种安装的分发,Magento 1.7安装类型被设计成视频、图文、音频、短文本等,针对不同的Magento 1.7内容,需要分发至不同的Magento 1.7安装,我们需要一个Magento 1.7magento,并且这些不同的Magento 1.7安装需要实现这个Magento 1.7magento,这就涉及到了magento实现类的动态调用。
流程示意图: getBeansOfType方法可以根据magento类型返回相应的所有bean。
Map getBeansOfType(@Nullable Class var1) throws BeansException;
1
1、 定义视频Magento 1.7magento
public interface VideoPublishService {

/**
* 上传信息
*
* @param payload 上传信息荷载
* @return 返回值外部作品id
*/
Result publish(T payload);
}
12345678910
2、安装类型枚举定义
public enum ChannelEnum {
KUAISHOU(“kuaishou”, “快手”),
DOUYIN(“douyin”, “抖音”),
BILIBILI(“bilibili”, “哔哩哔哩”);
}
12345
3、定义视频Magento 1.7magento实现类
@ChannelService(value = “bilibiliVideoPublishService”, channel = ChannelEnum.BILIBILI)
public class BilibiliVideoPublishServiceImpl implements VideoPublishService {
@Override
public Result publish(BilibiliPayload payload) {
return “哔哩哔哩Magento 1.7成功!”;
}
}

@ChannelService(value = “kuaishouVideoPublishService”, channel = ChannelEnum.KUAISHOU)
public class KuaishouVideoPublishServiceImpl implements VideoPublishService {
@Override
public Result publish(KuaishouPayload payload) {
return “快手Magento 1.7成功!”;
}
}
123456789101112131415
4、自定义Serviceamd@ChannelService
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface ChannelService {

@AliasFor(annotation = Component.class)
String value() default “”;

/**
* 安装名称
* @return
*/
ChannelEnum channel();
}
1234567891011121314
@AliasFor 表示别名,它可以amd到自定义amd的两个属性上,表示这两个互为别名,也就是说这两个属性其实同一个含义。 此处的别名是使用Component而不是Service,看一下Serviceamd,它的别名已经是Component了
5、工厂类
@Slf4j
@Component
public class VideoPublishDispatchService {

private HashMap mediaMap = Maps.newHashMap();

@Autowired
private ApplicationContextUtils applicationContextUtils;

/**
* 初始化授权服务
*/
@PostConstruct
public void init() throws Exception {
ApplicationContext context = applicationContextUtils.getApplicationContext();
// 得到所有的实现类
Map beanMap = context.getBeansOfType(VideoPublishService.class);
for (Map.Entry mediaPublishServiceEntry : beanMap.entrySet()) {
Class targetClass = AopUtils.getTargetClass(mediaPublishServiceEntry.getValue());
ChannelService channelServiceInfo = targetClass.getAnnotation(ChannelService.class);
if(null == channelServiceInfo){
log.error(“安装名称未设置,class:{},channel:{}”,targetClass.getName(), ChannelService.class.getName());
throw new Exception(“服务:”+targetClass.getName()+” 需要配置对应的安装名称”);
}
mediaMap.put(channelServiceInfo.channel().getChannelId(),mediaPublishServiceEntry.getValue());
}
}

/**
* 获取服务
*
* @param channelId 服务类型
* @return
*/
public MediaPublishService getService(String channelId) {
return mediaMap.get(channelId);
}
}
1234567891011121314151617181920212223242526272829303132333435363738
/**
* 上下文获取工具类
*/
@Slf4j
@Component
public class ApplicationContextUtils implements ApplicationContextAware {

private ApplicationContext applicationContext;

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}

public ApplicationContext getApplicationContext() {
return this.applicationContext;
}
}
123456789101112131415161718
@PostConstruct说明
servlet的生命周期:服务器加载servlet -> PostConstruct -> init -> doGet/doPost -> destroy -> PreDestroy -> 完毕 当使用依赖注入时,使用@Autowired将A注入到B中,首先需要生成这两个对象,那么Autowired是在构造方法Constructor后执行的。如果想在生成对象时完成某些初始化操作,而偏偏这些初始化操作又依赖于依赖注入,那么就无法在构造函数中实现。为此,可以使用@PostConstructamd一个方法来完成初始化,@PostConstructamd的方法将会在依赖注入完成后被自动调用。 执行顺序是:Constructor -> Autowired -> PostConstruct
6、调用
VideoPublishService videoWorker = VideoPublishDispatchService.getService(channelId);
1