package com.haoyu.common.utils;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.extra.spring.SpringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
/**
* 寻找beanName
*/
@Component
public class SeekBeanNameUtils<T> {
@Autowired
private ApplicationContext applicationContext;
/**
* 根据name匹配实现了targetInterface的接口
* @param name
* @param targetInterface
* @return
*/
public T getBeanByName(String name,Class targetInterface){
// 查找所有实现了改接口的beanName
String[] beanNamesForType = applicationContext.getBeanNamesForType(targetInterface);
if (beanNamesForType.length == 0) return null;
// 匹配到的beanName
List<String> beanNames = CollUtil.newArrayList();
for (int i = 0; i < beanNamesForType.length; i++) {
if (beanNamesForType[i].contains(name)) beanNames.add(beanNamesForType[i]);
}
if (CollUtil.isEmpty(beanNames)) return null;
// 寻找相似度最低的beanName
String beanName = beanNames.get(0);
if (beanNames.size() == 1) SpringUtil.getBean(beanName);
// 寻找长度最短的bean
beanName = beanNames
.stream()
.max((o1, o2) -> o2.length() - o1.length())
.get();
return SpringUtil.getBean(beanName);
}
}
定义一个接口
public interface IPublishCommentDispose {
/**
* 发布评论处理
* @param relationId
*/
void publishCommentDispose(String relationId);
}
假设有很多类实现了一个接口
public class DiscussionUserServiceImpl implements IPublishCommentDispose {
。。。
}
此时可以这样获取
@Autowired
private SeekBeanNameUtils<IPublishCommentDispose> seekBeanNameUtils;
// 然后某serviceImpl就实现这个IPublishCommentDispose接口
IPublishCommentDispose publishCommentDispose = seekBeanNameUtils.getBeanByName(map.get("type"), IPublishCommentDispose.class);
if (publishCommentDispose == null) return;
publishCommentDispose.publishCommentDispose(map.get("relationId"));