一、背景
https://www.jianshu.com/p/4c0723615a52
创建ApplicationContextUtil,是为了能在java new的对象中,使用getBean方法,方便获取bean对象。
二、用法
/**
@Lazy(value=true)
使用该对象的时候再加载ApplicationContextUtil
会减少springIoc启动时候消耗的时间
**/
@Component
@Lazy(value=true)
public class ApplicationContextUtil implements ApplicationContextAware {
private Map<String,ApplicationContext> contexts = new ConcurrentHashMap<>(16);
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
/**
要想使用这个对象,那么就需要先创建这个对象
**/
synchronized (contexts) {
contexts.put(applicationContext.getId(), applicationContext);
}
}
public <T> T getBean(String id, String name) {
// 先判断是否包含该id
if (!contexts.containsKey(id)) {
return null;
}
//name表示其他要注入的注解name名
return (T) contexts.get(id).getBean(name);
}
public <T> T getBean(String id, Class<T> classType) {
if (!contexts.containsKey(id)) {
return null;
}
return contexts.get(id).getBean(classType);
}
/**
获取对应name,对应class的bean对象
**/
public <T> T getBean(String name, Class<T> classType) {
if (Objects.isNull(name) || Objects.isNull(classType)) {
return null;
}
for (ApplicationContext item : contexts.values()) {
if (item.containsBean(name)) {
return (T) item.getBean(name, classType);
}
}
}
applicationContext怎么获取这个对象呢?
ApplicationContextUtil.setApplicationContext()
在ApplicationContextAwareProcessor的invokeAwareInterfaces(Object bean) 方法,对实现了Aware接口的bean进行注入相对应的实例。
参考:
[链接](https://blog.csdn.net/canyanruxue/article/details/81181562)