2013-10-31 60 views
2

我有一个抽象类“Command”,带有@Autowired依赖项和扩展抽象类的类。依赖项没有被注入。抽象和具体类用@Component注释并正在被扫描。看起来,基础(抽象)类不是由spring管理的。需要做些什么?是否有注释将其定义为抽象?我不想用XML定义bean。抽象类中定义的Spring自动装配依赖关系

public abstract class Command { 
    @Autowired 
    private SecurityUtils securityUtils; 
.... 

@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS) 
@Component 
public class NoteCommand extends Command { 
... 
} 

我的错误我很抱歉。命令类被注入到我的控制器中,其中一个(NoteCommand)通过“new”手动实例化。一切都很好。

+0

您的应用程序是否因不满意的自动布线字段而失败? –

+0

Spring容器是通过组件扫描实例化bean还是你自己在某处调用'new'?如果还没有一个,在子类中添加一个依赖项并确认它已被正确注入。最后,你究竟在哪里尝试访问缺少的'securityUtils'? – chrylis

+0

另外,如果将'securityUtils'的可见性从'private'更改为'protected',会发生什么? – chrylis

回答

0

这可以通过XML配置来实现(不确定注释)。阅读本http://docs.spring.io/spring-framework/docs/3.0.0.RC3/reference/html/ch03s07.html

试试这个(添加其他配置到子豆?)

<bean id = "command" class = "some.package.name.Command" abstract = "true"> 
    <property name = "securityUtils" ref = "securityUtils"/> 
</bean> 

<bean id ="noteCommand" class = "some.package.name.NoteCommand" parent="commadn"> 

</bean> 

喝彩!

-1

在我的情况下,在Spring4应用程序中,我不得不使用经典的抽象工厂模式(为此我从 - http://java-design-patterns.com/patterns/abstract-factory/的想法)创建实例,每次都有一个操作要完成。代码是设计,如:

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,因为Spring无法识别并注入它的依赖经过大量的试验和错误,我使用了这个注解,最终Spring能够注入依赖关系,并且我能够使用子类中的属性而不会让它们拥有太多的属性。

<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. Using abstract factory with Spring framework
  7. Spring Autowiring not working for Abstract classes
  8. Inject spring dependency in abstract super class
  9. Spring and Abstract class - injecting properties in abstract classes
  10. Spring can you autowire inside an abstract class?

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

相关问题