Spring можете ли вы autowire внутри абстрактного класса?

весна не в состоянии autowire мой объект? Можно ли автоматически подключить объект в абстрактном классе. Предположим, что все схемы поставляются в application-context.в XML

вопрос: какая аннотация должна быть на базовом и расширяющем классах (если есть) @Service @Component?

пример

abstract class SuperMan {

    @Autowire
    private DatabaseService databaseService;

    abstract void Fly();

    protected void doSuperPowerAction(Thing thing) {

        //busy code

        databaseService.save(thing);

    }
}

расширяя класс

public class SuperGirl extends SuperMan {

    @Override
    public void Fly() {
        //busy code
    }

    public doSomethingSuperGirlDoes() {

        //busy code

        doSuperPowerAction(thing)

    }

приложения-контекст.в XML

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

3 ответов


обычно Spring должен выполнять автозапуск, пока ваш абстрактный класс находится в базовом пакете, предусмотренном для сканирования компонентов.

посмотреть этой и этой для дальнейшего использования.

@Service и @Component оба стереотипа, которые создают бобы аннотированного типа внутри контейнера Spring. Как говорится в документах Spring,

эта аннотация служит специализацией @Component, позволяющей реализация классы, которые будут автоматически определяться с помощью сканирования classpath.


у меня такая весенняя настройка работает

абстрактный класс с autowired полем

public abstract class AbstractJobRoute extends RouteBuilder {

    @Autowired
    private GlobalSettingsService settingsService;

и несколько детей определено с @Component Примечание.


в моем случае, внутри приложения 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 и т. д., Но даже если весна контекстный файл имел ComponentScanning для всего пакета, но каким-то образом при создании экземпляров подклассов, таких как CampaignOperation, супер абстрактный класс EO имел null для своих свойств, поскольку spring не смог распознать и ввести свои зависимости.После многих проб и ошибок я использовал это **@Configurable(dependencyCheck = true)** аннотация и, наконец, Spring смогли ввести зависимости, и я смог использовать свойства в подклассе, не загромождая их слишком большим количеством свойства.

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

Я тоже пробовал эти ссылки найти абстрактная фабрика с пружинным каркасом

  • Spring Autowiring не работает для абстрактных классов
  • Inject spring dependency в абстрактном супер классе
  • Spring и абстрактный класс-инъекционные свойства в абстрактных классах
    1. зависимость Spring autowire, определенная в абстрактном классе
  • пожалуйста, попробуйте использовать **@Configurable(dependencyCheck = true)** и обновления этот пост, я могу попытаться помочь вам, если у вас возникнут какие-либо проблемы.