2010-09-27 3 views
6

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

@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 определяется в контексте spring.xml. Если userDao боба определяется в XML он работает отлично, но когда я ставлю @Repository аннотацию и удалить объявление боб я получаю следующее исключение

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

Обходной может быть, чтобы добавить новый метод, как

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

, но выглядит уродливым

Есть ли какой-либо другой способ, когда вы вводите свойство без определения?

+1

Я думаю, что ваше обходное решение довольно приличное. – Bozho

ответ

3

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

public class AutowiringSqlMapClientDaoSupport extends SqlMapClientDaoSupport { 

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

, а затем

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

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

+0

Я также подумал о том, чтобы иметь такой класс (у меня есть более одного DAO, поэтому он определенно лучше, чем у этого инъекционногоSqlMapClient в каждом DAO), но он выглядит уродливым для меня, потому что мне нужно ввести новый класс, который мне действительно не нужен - Я удаляю одну вещь (определения бобов), но получаю другую вместо этого (новый класс). Но в любом случае, спасибо за ваши мысли –

Смежные вопросы