用spring注释实现工厂设计模式

时间:2012-07-08 22:06:06

标签: spring annotations design-patterns factory

我有一个工厂类,应该返回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返回为null?

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

2 个答案:

答案 0 :(得分:0)

很难确定为什么在没有看到你的Spring配置的情况下你的自动接线没有发生。我的第一个猜测是你没有打开组件扫描:

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

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

答案 1 :(得分:0)

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环境中看起来很有用,你想要实现什么目标?