【问题标题】:Run time polymorphism using Spring IOC使用 Spring IOC 的运行时多态性
【发布时间】:2018-05-31 17:04:15
【问题描述】:

我有这个关于春季 IOC 的具体问题。我想使用 spring 实现运行时多态性。

我可以使用 if else 来达到同样的效果,但是我想知道一个正确的弹簧方式来做这件事。

要求:

我有接口 MyInterface 。

ImplA & ImplB 实现了 MyInterface 。

我有一个发送 "A" 或 "B" 的服务。根据请求参数,我想在我的控制器中注入 ImplA 或 ImplB 。

请建议在 spring 中使用依赖注入实现相同功能的最佳方法是什么

【问题讨论】:

    标签: spring spring-boot dependencies inversion-of-control


    【解决方案1】:

    如果你使用spring注解基础配置试试:

      @Bean(name = "aImpl")
      public MyInterface a() {
        return new AImpl();
      }
    
      @Bean(name = "bImpl")
      public MyInterface b() {
        return new BImpl();
      }
    

    使用@Qualifier获取正确的接口实例澄清bean名称

        @Autowired
        @Qualifier("a")
        MyInterface aImpl;
    
    
        @Autowired
        @Qualifier("b")
        MyInterface bImpl;
    

    【讨论】:

      【解决方案2】:

      有很多方法可以实现这一点。从我的角度来看几个想法:

      1. 使用工厂模式根据参数值返回您想要的 bean。
      2. 将两个 bean 放入 map 并使用参数值作为键。当您需要 bean 时,请从地图中获取。

      如果您需要更多信息,请告诉我。

      【讨论】:

        【解决方案3】:

        您可以在控制器方法中使用applicationContext.getBean("beanName")Here 是一个示例程序。您可以根据自己的情况以这种方式获得正确的 impl。

        【讨论】:

        • 据我了解,OP 想要摆脱条件。
        • applicationContext.getBean("beanName") 正在工作,我能够获得所需的 bean
        • 条件还可以吗?
        • 是的,基于我们通过传递获取正确 bean 的值而给出的 spring 名称。Bean 实例化发生在启动时,注入发生在调用时
        • 所有条件都得到满足我已经使用了限定符,因此根据从 url 传递的字符串,将提取相应的 bean
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-16
        • 2011-01-10
        • 1970-01-01
        • 2014-01-19
        • 2016-02-03
        • 1970-01-01
        相关资源
        最近更新 更多