【问题标题】:Spring and Abstract class - injecting properties in abstract classesSpring 和 Abstract 类 - 在抽象类中注入属性
【发布时间】:2011-08-25 02:43:15
【问题描述】:

我有一个抽象基类,它有一个名为“mailserver”的属性,我希望从 spring ioc 容器中注入它。但是,当我运行抽象类的具体实现时,邮件服务器属性为空。

这样做的正确方法是什么?您是否尝试过这样做并成功了?请分享。

【问题讨论】:

  • 你至少需要提供你的bean配置xml

标签: java spring


【解决方案1】:

使用abstract属性将抽象基类定义标记为抽象,并在具体类定义中将parent属性设为抽象类的bean名称

类似这样的:

<bean id="abstractBaseClass" abstract="true" class="pacakge1.AbstractBaseClass">
  <property name="mailserver" value="DefaultMailServer"/>
</bean>

<bean id="concreteClass1" class="pacakge1.ConcreteClass1" parent="abstractBaseClass">     
  <!--Override the value of the abstract based class if necessary-->
  <property name="mailserver" value="AnotherMailServer"/>
</bean>

【讨论】:

  • abstract here,AFAIK,并不是要将类标记为抽象类,这应该与 Spring 无关,而是为其他 bean 定义模板以在配置中使用 - 父 bean 定义。
  • 我可以使用 spring 的自动装配功能做同样的事情吗?
  • 这个答案(将 bean 标记为抽象)是否与问题相关?有人请评论。
【解决方案2】:

超类中的属性,无论是否抽象,都与 Spring 中的任何其他属性完全相同。您可以使用基于 XML、注释或 Java 配置的 setter、构造函数或字段注入。您会发现在整个 Spring 中都广泛使用继承:例如,DefaultMessageListenerContainer。展示您是如何尝试连接该属性的,有人可以解释为什么它不起作用。

【讨论】:

    【解决方案3】:

    在我的例子中,在 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、Super Abstract 这样的子类实例时EO 类的属性为 null,因为 spring 无法识别和注入它的依赖项。经过多次试验和错误后,我使用了这个 **@Configurable(dependencyCheck = true)** 注释,最后 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 autowire dependency defined in an abstract class
      1. Spring can you autowire inside an abstract class?

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

    【讨论】:

      猜你喜欢
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-08
      • 2021-11-03
      • 2014-02-17
      相关资源
      最近更新 更多