干货分享:小技巧大用处之Bean管理类工厂多种实现方式

[复制链接]
发表于 2022-9-4 07:45:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
前言:最近几个月很忙,都没有时间写文章了,今天周末刚好忙完下班相对早点(20:00下班)就在家把之前想总结的知识点写出来,于是就有了这篇文章。虽无很高深的技术,但小技巧有大用处。
有时我们经常需要将实现了某个基类或某个接口的所有Bean进行分类管理,在需要用到的时候按需获取实现了某个基类或某个接口的Bean实例对象,那么我们就需要Bean管理类工厂(即:工厂模式),实现Bean管理类工厂我总结了目前已知且常用的实现方式,敬请各位看官欣赏,如是不足或更好建议欢迎评论区留言指正,谢谢!
为了便于演示,我先自定义如下接口:
  1. /**
  2. * @author zuowenjun
  3. *  <pre>www.zuowenjun.cn</pre>
  4. */
  5. public interface IDemo {
  6.     String getValue();
  7.     int doFor();
  8. }
复制代码
然后定义3个实现了上述接口的Service Bean类:(注意到Bean类上方还有@DemoFactoryNeedBean这个先不用管,后面的方式中会有用到)
  1. @Service
  2. public class DemoService1 implements IDemo {
  3.     @Override
  4.     public String getValue() {
  5.         return "DemoService1.getValue by 梦在旅途 zuowj.cnblogs.com";
  6.     }
  7.     @Override
  8.     public int doFor() {
  9.         return 1;
  10.     }
  11. }
  12. @DemoFactoryNeedBean
  13. @Service
  14. public class DemoService2 implements IDemo {
  15.     @Override
  16.     public String getValue() {
  17.         return "DemoService2.getValue by 梦在旅途 zuowj.cnblogs.com";
  18.     }
  19.     @Override
  20.     public int doFor() {
  21.         return 2;
  22.     }
  23. }
  24. @DemoFactoryNeedBean
  25. @Service
  26. public class DemoService3 implements IDemo {
  27.     @Override
  28.     public String getValue() {
  29.         return "DemoService3.getValue by 梦在旅途 zuowj.cnblogs.com";
  30.     }
  31.     @Override
  32.     public int doFor() {
  33.         return 3;
  34.     }
  35. }
复制代码
下面直接无废话列举各种实现方式
<ol>实现方式一:直接使用集合的依赖注入方式(利用spring注入时会判断是否为集合,若为集合则获取所有实现了该类的BEAN集合并进行注入)
  1. /**
  2. * @author zuowenjun
  3. *  <pre>www.zuowenjun.cn</pre>
  4. */
  5. @Service
  6. public class DemoFactory1 {
  7.     @Autowired
  8.     private List<IDemo> demos;
  9.     public IDemo getOne(int index){
  10.         return demos.stream().filter(d->d.doFor()==index).findFirst().orElseThrow(()->new IllegalArgumentException("not found demo bean"));
  11.     }
  12. }
复制代码
单元测试【DemoFactory1】BEAN管理工厂用法及结果:
  1.     @Autowired
  2.     private DemoFactory1 demoFactory1;
  3.    
  4.         @Test
  5.     public void testDemoFactory1(){
  6.         for (int i=1;i<=3;i++){
  7.                 IDemo demo = demoFactory1.getOne(i);
  8.                 System.out.printf("testDemoFactory1--bean class: %s , getValue:%s,  doFor:%d %n", demo.getClass().getSimpleName(), demo.getValue(), demo.doFor());
  9.         }
  10.     }
复制代码
单元测试【DemoFactory2】BEAN管理工厂用法及结果:
  1. /**
  2. * @author zuowenjun
  3. *  <pre>www.zuowenjun.cn</pre>
  4. */
  5. @Service
  6. public class DemoFactory2 implements BeanPostProcessor {
  7.     private List<IDemo> demos=new ArrayList<>();
  8.     public IDemo getOne(int index){
  9.         return demos.stream().filter(d->d.doFor()==index).findFirst().orElseThrow(()->new IllegalArgumentException("not found demo bean"));
  10.     }
  11.     @Override
  12.     @Nullable
  13.     public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
  14.         if (bean instanceof IDemo) {
  15.             System.out.printf("postProcessAfterInitialization->bean class:%s",bean.getClass().getSimpleName());
  16.             demos.add((IDemo) bean);
  17.         }
  18.         return bean;
  19.     }
  20. }
复制代码
单元测试【DemoFactory3】BEAN管理工厂用法及结果:
[code]    @Autowired    private DemoFactory3 demoFactory3;    @Test    public void testDemoFactory3(){        for (int i=1;i
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表