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" />
Я тоже пробовал эти ссылки найти абстрактная фабрика с пружинным каркасом
пожалуйста, попробуйте использовать **@Configurable(dependencyCheck = true)**
и обновления этот пост, я могу попытаться помочь вам, если у вас возникнут какие-либо проблемы.