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