动态代理模式
public interface IService{
}
public class ServiceImpl impl IService {
}
当一个类实现了ApplicationContextAware之后,这个类就可以方便获得ApplicationContext中的所有bean,
这个类可以直接获取spring配置文件中,所有有引用到的bean对象。
@Component
public final class ApplicationUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext contex) throws BeansException {
this.applicationContext = contex;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
}
//@DependsOn。@DependsOn强调的是Bean与Bean之间的依赖关系。如:A @DependsOn B表示,只有当B初始化完成了才会去初始化A。这里所谓的Bean可以是任何Bean:包括@Bean、@Component、@Configuration等一切形式
@DependsOn("applicationUtil")
@Slf4j
@Component
public class IDataStrategy {
private static final Map<String, IService> HANDLER_MAP = new ConcurrentHashMap<>();
@PostConstruct
public static void init() {
Map<String, IService> beansOfType = ApplicationUtil.getApplicationContext().getBeansOfType(IService.class);
for (String key : beansOfType.keySet()) {
try {
// 获取代理对象代理的目标对象工具类
Class<?> aClass = AopTargetUtils.getTarget(beansOfType.get(key)).getClass();
} catch (Exception e) {
log.info("获取服务异常",e);
}
//可在这里定义一个枚举
// HANDLER_MAP.put(enum, beansOfType.get(key));
HANDLER_MAP.put("1", beansOfType.get(key));
}
}
public static IService getImportHandler(String type) {
IService importHandler = HANDLER_MAP.get(type);
return importHandler;
}
}
在spring中获取代理对象代理的目标对象工具类
https://blog.csdn.net/weixin_34289744/article/details/92179853
@Test
public void test2(){
IService importHandler = DataStrategy.getImportHandler("1");
//查询数据
importHandler.selectList(null);
}