2012-07-08 58 views
0

我有一个工厂类,应该返回我的classAclassB的实例。这些类实现接口XYZ实现工厂设计模式与春天annotaion

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返回为空?

什么是最好的方法来实现与春注释和自动布线的工厂模式?

回答

0

很难确定地说为什么你的自动布线没有看到你的Spring配置而发生。我的第一个猜测是,你不必组件扫描接通:

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

添加类似的东西到你的Spring配置文件(用正确的软件包)将告诉Spring扫描封装结构需要的字段自动接线以及可用于自动布线的服务。

+0

感谢您的快速响应小修正 – user1421204 2012-07-08 22:28:13

+0

我无法调用ABCFactory.getInstance(“A”);因为getInstance不是静态的,所以我应该如何从客户端调用getInstance。您提到的配置正确 – user1421204 2012-07-08 22:29:46

+0

我找到了解决方案,只需在客户端控制器中配置工厂类,该客户端控制器已成功完成链并调用服务 – user1421204 2012-07-08 22:43:37

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; 

BTW您的设计看起来春季环境supicious,你是什么想要实现?