Могу ли я аннотировать унаследованное конечное свойство с помощью @Autowire? - PullRequest
5 голосов
/ 18 июня 2009

Разрешение: Нет, я больше не расширяю оригинального родителя.

Оригинал:
Есть ли способ аннотировать унаследованный final метод установки? Я расширяю класс с final установщиком, который я бы хотел @Autowire с помощью Spring. Родительский класс взят из библиотеки и не может быть изменен.

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

public abstract class SqlMapClientDaoSupport ... {
    public final void setSqlMapClient(SqlMapClient smc) {
        ...
    }
}

@Component
public class AccountDao extends SqlMapClientDaoSupport {
    // all this just to annotate an existing method?
    @Autowire
    public final void setSqlMapClientWorkaround(SqlMapClient smc) {
        super.setSqlMapClient(smc);
    }
}

Редактировать 1: Приведенный выше пример изменен для отражения варианта использования:
Вариант использования реализует объекты DAO для Ibatis / Spring которые расширяют общий базовый класс . Каждый DAO нуждается в том же Свойство установлено, и каждый из них должен быть настроен как компонент. Я сейчас Сделайте это, настроив каждый в отдельности в applicationContext.xml.

<bean id="accountDAO" 
  class="com.example.proj.dao.h2.AccountDAOImpl"
  p:sqlMapClient-ref="sqlMapClient" />
<bean id="companyDAO" 
  class="com.example.proj.dao.h2.CompanyDAOImpl"
  p:sqlMapClient-ref="sqlMapClient" />
<!-- etc... -->

Я бы предпочел использовать компонентное сканирование для обнаружения и автоматического подключения DAO объекты автоматически, которые я не могу скопировать / вставить Botch.

<context:component-scan base-package="com.example.proj.dao.h2" />

Я не вижу в руководстве по аннотациям , как можно комментировать собственность / член, отличная от заявленной. Я надеюсь, что это что-то я упускаю, хотя.

Редактировать 2: Я больше не расширяю класс SqlMapClientDaoSupport, вместо этого мой AccountDao - это POJO, который реализует те небольшие функциональные возможности, которые предоставляет класс Support. Это позволяет мне использовать @Autowire по желанию.

Ответы [ 4 ]

2 голосов
/ 18 июня 2009

Вы пытались настроить его с помощью XML? Поскольку это существующий класс, который, похоже, вы не можете изменить, он является определенным кандидатом для настройки его с помощью XML Затем вы можете указать его как "autowire" или даже настроить свойство в xml.

0 голосов
/ 12 февраля 2010

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

0 голосов
/ 15 сентября 2009

Нет, нет способа аннотировать унаследованный конечный метод.

Вместо того, чтобы расширять класс поддержки (SqlMapClientDaoSupport), я переопределил его в своем проекте (его поведение минимально), комментируя необходимые методы, и мой DAO расширяет этот класс поддержки.

0 голосов
/ 22 июня 2009

Мне кажется, что вы не должны пытаться установить окончательное поле.

Обычно есть веская причина, по которой поля являются окончательными.

Вы установили объект SqlMapClientFactoryBean?

См. здесь для помощи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...