如何在spring中自动装配一个通用bean

时间:2014-10-23 12:42:33

标签: spring generics spring-bean

如何在spring中自动装配通用bean?

我有一个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;

我在spring 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工具的一个好习惯?

2 个答案:

答案 0 :(得分:1)

使用您的界面而不是实现

不要在持久层中使用@Transactional,因为它更有可能属于您的服务层。

正如所说的那样,扩展通用dao并自动装配可能更有意义。一个例子是:

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;

答案 1 :(得分:0)

还有另一种方式。

我将GenericDaoImpl<T>更改为没有Generic的公共类,但在函数中使用泛型 level,entityClass可以在spring xml中配置。