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

打印 上一主题 下一主题

主题 872|帖子 872|积分 2616

前言:最近几个月很忙,都没有时间写文章了,今天周末刚好忙完下班相对早点(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
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

水军大提督

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表