我有一个项目,我有一个接口,抽象类实现相同的接口,然后一组实现这个接口和扩展抽象类的具体课程。
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()
我不知道我是什么在这里失踪。 我想看看组件扫描和范围,并不能发现什么概念是错误的。
我使用的是工厂获得TypeAInvoice发票的一个实例
根据您的工厂做什么,这可能是问题。 如果工厂创建了一个新的TypeAInvoice
,春天的布线不适用。 你要查询的豆Spring上下文。 一种方法(虽然不是很漂亮)是使用ContextLoader
:
return ContextLoader.getCurrentWebApplicationContext().getBean(TypeAInvoice.class)
我想说的静态工厂及春季不要去得很好。 春表示控制模式的反转,而工厂代表Service Locator模式。 我建议你摆脱你的工厂和自动装配你的Spring Bean。
一切都很好,除了一个事实,你使用一个工厂来获得TypeAInvoice。 如果你喜欢TypeAInvoice打字员=新TypeAInvoice创建它(),那么春天什么都不知道的话,作家是不是自动连接,在那里你会得到NullPointerException异常。 你应该从Spring应用程序上下文中的豆。
在我的情况下,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" />
我也尝试过这些引用找到一个解决办法:
- http://www.captaindebug.com/2011/06/implementing-springs-factorybean.html#.WqF5pJPwaAN
- http://forum.spring.io/forum/spring-projects/container/46815-problem-with-autowired-in-abstract-class
- https://github.com/cavallefano/Abstract-Factory-Pattern-Spring-Annotation
- http://www.jcombat.com/spring/factory-implementation-using-servicelocatorfactorybean-in-spring
- https://www.madbit.org/blog/programming/1074/1074/#sthash.XEJXdIR5.dpbs
- 使用抽象工厂与Spring框架
- 春天和抽象类-在抽象类中注入性
- 注入抽象超班春依赖
- 在抽象类定义的春天自动装配依赖
- Spring可以自动装配你一个抽象类里面?
请尝试使用**@Configurable(dependencyCheck = true)**
和更新这个帖子,我可能会尝试帮助你,如果你面对任何问题。
因此,正是在这里我要说的是,你并不需要所有的时间从Spring上下文获得一个bean。