【问题标题】:Implement factory design pattern with spring annotaion使用 spring 注解实现工厂设计模式
【发布时间】:2012-07-08 22:06:06
【问题描述】:

我有一个工厂类,它应该返回一个classAclassB 的实例。这些类实现了接口XYZ

   interface xyz;
   getInstance()

   @service 
   classA implements xyz{
      public void checkStatus(){
      }
   }

   @service  classB implements xyz{
      public void checkStatus(){
      }
   }

工厂类:

   @component
   class ABCFactory{
       @Autowire classA A;
       public static getInstance(str a){
           return classA;
       }
   }

客户端代码:

   Class A a = ABCFactory.getInstance("A");
   a.checkStatus();

我得到空指针异常——可能a 被返回为空?

使用 spring 注释和自动装配 bean 实现工厂模式的最佳方法是什么?

【问题讨论】:

    标签: spring annotations design-patterns factory


    【解决方案1】:

    如果没有看到您的 Spring 配置,很难确定为什么您的自动装配没有发生。我的第一个猜测是您没有打开组件扫描:

    <context:component-scan base-package="org.example"/>
    

    将类似的内容添加到您的 spring 配置文件(使用正确的包)将告诉 Spring 扫描包结构以查找需要自动连接的字段以及可用于自动连接的服务。

    【讨论】:

    • 我不能调用 ABCFactory.getInstance("A");因为 getInstance 不是静态的,所以我应该如何从客户端调用 getInstance。如您所述,配置正确
    • 我找到了解决方案,只需在客户端控制器中配置工厂类即可成功完成链并调用服务
    【解决方案2】:

    static 是万恶之源。你是如何在这里访问classA的?

    @Component
    class ABCFactory{
       @Autowire classA A;
       public static getInstance(str a){
           return classA;
       }
    }
    

    A 字段不是静态的,而getInstance() 方法是静态的 - 你的代码不会编译。

    此外,依赖注入适用于实例,而不适用于static 类。因此你应该摆脱static

    @Component
    class ABCFactory {
       @Autowire classA A;
       public xyz getInstance(str a){
           return A;
       }
    }
    

    并在您需要的地方注入ABCFactory(例如在其他服务或控制器中):

    @Autowired
    private ABCFactory factory;
    

    顺便说一句,你的设计在 Spring 环境中看起来很可疑,你想实现什么?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-17
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多