弹簧自动装配不工作的抽象类(Spring Autowiring not working for Ab

2019-06-25 22:27发布

我有一个项目,我有一个接口,抽象类实现相同的接口,然后一组实现这个接口和扩展抽象类的具体课程。

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.....*/}
}

春天文件具有封装组件扫描。

<context:annotation-config>
<context:component-scan base-package="com.xyz" />

我使用的是工厂获得的实例TypeAInvoice发票现在要求invoice.process()获取前往当NPE write.write()

我不知道我是什么在这里失踪。 我想看看组件扫描和范围,并不能发现什么概念是错误的。

Answer 1:

我使用的是工厂获得TypeAInvoice发票的一个实例

根据您的工厂做什么,这可能是问题。 如果工厂创建了一个新的TypeAInvoice ,春天的布线不适用。 你要查询的豆Spring上下文。 一种方法(虽然不是很漂亮)是使用ContextLoader

return ContextLoader.getCurrentWebApplicationContext().getBean(TypeAInvoice.class)

我想说的静态工厂及春季不要去得很好。 春表示控制模式的反转,而工厂代表Service Locator模式。 我建议你摆脱你的工厂和自动装配你的Spring Bean。



Answer 2:

一切都很好,除了一个事实,你使用一个工厂来获得TypeAInvoice。 如果你喜欢TypeAInvoice打字员=新TypeAInvoice创建它(),那么春天什么都不知道的话,作家是不是自动连接,在那里你会得到NullPointerException异常。 你应该从Spring应用程序上下文中的豆。



Answer 3:

在我的情况下,Spring4应用程序里面,我不得不用一个经典的抽象工厂模式(我把这个想法从- http://java-design-patterns.com/patterns/abstract-factory/ )创建的每个实例每有是done.So我的代码运行时间进行设计,如:

public abstract class EO {
    @Autowired
    protected SmsNotificationService smsNotificationService;
    @Autowired
    protected SendEmailService sendEmailService;
    ...
    protected abstract void executeOperation(GenericMessage gMessage);
}

public final class OperationsExecutor {
    public enum OperationsType {
        ENROLL, CAMPAIGN
    }

    private OperationsExecutor() {
    }

    public static Object delegateOperation(OperationsType type, Object obj) 
    {
        switch(type) {
            case ENROLL:
                if (obj == null) {
                    return new EnrollOperation();
                }
                return EnrollOperation.validateRequestParams(obj);
            case CAMPAIGN:
                if (obj == null) {
                    return new CampaignOperation();
                }
                return CampaignOperation.validateRequestParams(obj);
            default:
                throw new IllegalArgumentException("OperationsType not supported.");
        }
    }
}

@Configurable(dependencyCheck = true)
public class CampaignOperation extends EO {
    @Override
    public void executeOperation(GenericMessage genericMessage) {
        LOGGER.info("This is CAMPAIGN Operation: " + genericMessage);
    }
}

最初注入的依赖于抽象类,我尝试了所有的刻板印象注释像@Component,@Service等,但即使Spring上下文文件已经ComponentScanning整个包,但不知何故,同时创造像CampaignOperation子类的实例,超级抽象类是EO其为null,其属性春天无法识别,并注入其dependencies.After大量的试验和错误我用这个**@Configurable(dependencyCheck = true)**注释终于春天是能够注入的依赖关系和我能够使用子类中的属性,而无需太多的性能弄乱它们。

<context:annotation-config />
<context:component-scan base-package="com.xyz" />

我也尝试过这些引用找到一个解决办法:

  1. http://www.captaindebug.com/2011/06/implementing-springs-factorybean.html#.WqF5pJPwaAN
  2. http://forum.spring.io/forum/spring-projects/container/46815-problem-with-autowired-in-abstract-class
  3. https://github.com/cavallefano/Abstract-Factory-Pattern-Spring-Annotation
  4. http://www.jcombat.com/spring/factory-implementation-using-servicelocatorfactorybean-in-spring
  5. https://www.madbit.org/blog/programming/1074/1074/#sthash.XEJXdIR5.dpbs
  6. 使用抽象工厂与Spring框架
  7. 春天和抽象类-在抽象类中注入性
  8. 注入抽象超班春依赖
  9. 在抽象类定义的春天自动装配依赖
    1. Spring可以自动装配你一个抽象类里面?

请尝试使用**@Configurable(dependencyCheck = true)**和更新这个帖子,我可能会尝试帮助你,如果你面对任何问题。

因此,正是在这里我要说的是,你并不需要所有的时间从Spring上下文获得一个bean。



文章来源: Spring Autowiring not working for Abstract classes