внедрение производного свойства для бина @Repository без @Autowired в суперклассе - PullRequest
6 голосов
/ 28 сентября 2010

Я бы хотел использовать аннотацию @Repository spring, чтобы избежать добавления bean-компонента в context.xml. Я использую интеграцию ibatis, поэтому мой класс репозитория выглядит так

@Repository("userDao")
public class UserDaoMybatis extends SqlMapClientDaoSupport implements UserDao {
    // ...
}

SqlMapClientDaoSupport (класс библиотеки пружин) имеет финальный метод для установки обязательного свойства, которое не аннотировано @Autowired или @ Resourse

public final void setSqlMapClient(SqlMapClient sqlMapClient) {
    if (!this.externalTemplate) {
        this.sqlMapClientTemplate.setSqlMapClient(sqlMapClient);
    }
}

Компонент SqlMapClient определен в весеннем context.xml. Если bean-компонент userDao определен в XML, он работает нормально, но когда я помещаю аннотацию @Repository и удаляю объявление bean-компонента, я получаю следующее исключение

java.lang.IllegalArgumentException: Property 'sqlMapClient' is required

Обходным путем может быть добавление нового метода, например

@Aitowired
injectSqlMapClient(SqlMapClient sqlMapClient) {
    setSqlMapClient(sqlMapClient);
}

но выглядит ужасно

Есть ли другой способ ввести свойство, не определив?

1 Ответ

3 голосов
/ 28 сентября 2010

Как насчет введения промежуточного суперкласса?

public class AutowiringSqlMapClientDaoSupport extends SqlMapClientDaoSupport {

   @Autowired
   injectSqlMapClient(SqlMapClient sqlMapClient) {
      setSqlMapClient(sqlMapClient);
   }
}

, а затем

@Repository("userDao")
public class UserDaoMybatis extends AutoringSqlMapClientDaoSupport implements UserDao {
    // ...
}

Да, это злоупотребление наследованием, но не хуже, чем у существующего SqlMapClientDaoSupport, и если выотчаянно пытаюсь избежать инъекционного хука в самом классе DAO, я не могу придумать лучшего способа.

...