ApplicationContextAware获取bean和策略模式

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。

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值