前提: 使用到某类服务时可能会需要注入这类服务的所有的bean, 每次注入都很麻烦, 可以通过封装一个这类服务的bean的缓存来便捷获取到对应的bean的类.
package com.imooc.ad.index;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.core.PriorityOrdered;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @Auther: louye
* @Date: 2022/10/3 14:43
* @Description:
* 对于一类服务有需要同时注入多个bean的时候, 可以通过一个缓存bean来对需要注入的bean进行封装,
* 每次需要使用到这类服务就可以直接使用这个缓存bean, 然后再在要使用的地方通过class来获取缓存bean
*/
@Component
public class DataTable implements ApplicationContextAware, PriorityOrdered {
private static ApplicationContext applicationContext;
public static final Map<Class, Object> dataTableMap = new ConcurrentHashMap<>();
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
DataTable.applicationContext = applicationContext;
}
@Override
public int getOrder() {
return PriorityOrdered.HIGHEST_PRECEDENCE;
}
@SuppressWarnings("all")
public static <T> T of(Class<T> clazz) {
T instance = (T) dataTableMap.get(clazz);
if (instance != null) {
return instance;
}
dataTableMap.put(clazz, bean(clazz));
return (T) dataTableMap.get(clazz);
}
@SuppressWarnings("all")
private static <T> T bean(String beanName) {
return (T) applicationContext.getBean(beanName);
}
@SuppressWarnings("all")
private static <T> T bean(Class clazz) {
return (T) applicationContext.getBean(clazz);
}
}