1、获取目标Bean对象:
ApplicationContextAware接口:继承重写setApplicationContext即可获取applicationContext,
applicationContext的
<T> T getBean(name,class)方法:根据父类的class对象,可以获取所有的子类bean ,再根据bean的名称获取准确的一个bean。
Map<String,T> getBeansOfType(class)方法:传入父类的class对象即可获取所有子类的bean,key是name,value是bean。
获取的map不仅可以根据bean的名称获取,也可以在重写的类中定义一个静态的beanMap,我们获取到从applicationContext获取的默认的map后,可以根据在每个bean的方法写一个方法,返回数字等在该父类class的所有的实现类bean中是唯一表示 即可。
//父类可以是接口也可以是接口
public interface ParentClass{
}
//子类之一
@Component("sub")
public class SubClass implements ParentClass{
public int getOnlyFlag{
return 1;
}
}
//实现ApplicationContextAware,再重写setApplicationContext()方法即可拿到applicationContext
public class ApplicationContextUtil implements ApplicationContextAware{
/**第一种:就可ApplicationContextUtil.getApplicationContext().getBean("sub",ParentClass.class)拿到我们需要的这个子类的bean
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(applicationContext applicationContext){
ApplicationContextUtil.ApplicationContext = applicationContext;
}
public ApplicationContext getApplicationContext(){
return applicationContext;
}
**/
/**第二种:根据类型获取所有子类的bean,然后根据每个bean的各自独特的类型标识,在放入属性map中,要获取只需要调用getBean(int type)方法即可。
private Map<int,ParentClass> beansMap = new ConCurrentHashMap();
@Override
public void setApplicationContext(applicationContext applicationContext){
Map<Map,ParentClass> beanMap = applicationContext.getBeansOfType(ParentClass.class);
beanMap.values().forEach(bean->beansMap.put(bean.getOnlyFlag(),bean));
}
public ParentClass getBean(int type){
return beansMap.get(type);
}
**/
}
2、上述的获取bean的方式是策略模式的核心。
第一种根据名称和类型获取bean的方式,需要额外写一个枚举,记录调用bean的上下文获取每个子类实现的bean。
第二种可直接根据每个子类独特标识直接从map中返回对应的bean。