Spring Autowiring不适用于抽象类

laz*_*wiz 4 spring abstract-class autowired

我有一个项目,我有一个接口,一个实现相同接口的Abstract类,然后是一组实现此接口并扩展Abstract类的具体类.

public interface Invoice
{
   void process();
}

@component
public abstract class AbstractInvoice(){

    @Resource
    protected Writer writer;

    protected validateInvoice(){
        //some implementation
    }
}

@Component
public Class TypeAInvoice() extends AbstractInvoice implements Invoice{

    @Override
    public void process(){
        //... some code
        writer.write();
    }
}

public Interface Writer(){
    public void write();
}

@Component
public class CDWriter implements Writer{
    @Override 
    public void write() { /* implementation.....*/}
}
Run Code Online (Sandbox Code Playgroud)

Spring文件包含组件扫描.

<context:annotation-config>
<context:component-scan base-package="com.xyz" />
Run Code Online (Sandbox Code Playgroud)

我正在使用工厂来获取TypeAInvoice发票实例现在调用时invoice.process()会获得NPEwrite.write()

我不知道我在这里错过了什么.我试图查看组件扫描和范围,但在概念上找不到任何错误.

Sea*_*oyd 5

我正在使用工厂获取TypeAInvoice发票的实例

根据您的工厂的不同,这可能是问题所在.如果工厂创建新的TypeAInvoice,则不适用弹簧接线.您必须查询Bean的Spring上下文.一种方法(虽然不是很漂亮)是使用ContextLoader:

return ContextLoader.getCurrentWebApplicationContext().getBean(TypeAInvoice.class)
Run Code Online (Sandbox Code Playgroud)

我会说静态工厂和春天不能很好地融合在一起.Spring代表控制反转模式,而工厂代表服务定位模式.我建议你摆脱你的工厂并自动装配你的春豆.