Как автоматически связать универсальный компонент весной

Как связать общий боб весной?

У меня есть реализация dao следующим образом:

@Transactional
public class GenericDaoImpl<T> implements IGenericDao<T>
{

    private Class<T> entityClass;

    @Autowired
    private SessionFactory sessionFactory;

    public GenericDaoImpl(Class<T> clazz) {

        this.entityClass = clazz;
    }
    ...
}

Теперь я хочу автоматически подключить DaoImpl следующим образом:

@Autowired
GenericDaoImpl<XXXEntity> xxxEntityDao;

Я настраиваю весной xml:

<bean id="xxxEntityDao" class="XXX.GenericDaoImpl">
    <constructor-arg name="clazz">
        <value>xxx.dao.model.xxxEntity</value>
    </constructor-arg>
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

Но у меня не работает, как мне его настроить? или хорошая практика в отношении универсальной реализации Dao?


person NingLee    schedule 23.10.2014    source источник
comment
Какая весенняя версия? Должен работать с веткой Spring 4.x. По крайней мере, это то, что я ожидал.   -  person M. Deinum    schedule 23.10.2014
comment
весна 3.2.8 и спящий режим 4.1.1   -  person NingLee    schedule 23.10.2014
comment
Тогда обновление является единственным вариантом, чтобы заставить его работать. Он работает в Spring 4 (в этой области было сделано несколько обновлений для Spring 4), он не будет работать в версиях до этого.   -  person M. Deinum    schedule 23.10.2014


Ответы (2)


Работайте со своими интерфейсами вместо реализаций

Не используйте @Transactional на постоянном уровне, так как гораздо более вероятно, что он принадлежит вашему сервисному уровню.

Тем не менее, может быть, имеет смысл расширить общий дао и автоматически подключить его. Примером может быть что-то вроде:

public interface UserDao extends GenericDao<User> {

    User getUsersByNameAndSurname(String name, String surname);
    ... // More business related methods
}

public class UserDaoImpl implements UserDao {

    User getUsersByNameAndSurname(String name, String surname);
    {
        ... // Implementations of methods beyond the capabilities of a generic dao
    }

    ...
}

@Autowired
private UserDao userDao; // Now use directly the dao you need

Но если вы действительно хотите использовать его таким образом, вам нужно объявить квалификатор:

@Autowired
@Qualifier("MyBean")
private ClassWithGeneric<MyBean> autowirable;
person Pumpkin    schedule 23.10.2014
comment
Но как мне настроить bean-компонент в spring xml? - person NingLee; 23.10.2014
comment
‹bean id=MyBean class=com.project.persistent.dao.MyEntity/› или вы можете напрямую аннотировать его - person Pumpkin; 23.10.2014
comment
И, таким образом, я должен настроить много bean-компонентов в spring xml для каждого объекта, например UserDao, BookDao, XXXDao... - person NingLee; 23.10.2014
comment
Да, но вам это все равно понадобится, вам нужны определенные объекты дао для каждой из ваших таблиц, так как ваши требования будут разными для них всех, и один общий дао может не справиться с этим. На мой взгляд, это также улучшит читаемость и возможность записи. - person Pumpkin; 23.10.2014
comment
И не настраивайте их в xml, сделайте это с помощью аннотации: @Repository public class MyDao... - person Pumpkin; 23.10.2014

Есть альтернативный способ.

Я меняю GenericDaoImpl<T> на общий класс без универсального, но использую общий на функциональном уровне, а entityClass можно настроить в spring xml.

person NingLee    schedule 24.10.2014