0

GenericDAOエンティティと主キーの型の 2 つのジェネリック型を持つインターフェイスを開発しました。

public interface GenericDAO<E, PK extends Serializable> {
    PK save(E newInstance);
    void update(E transientObject);
    //typical dao methods
}

次に、休止状態 4 でそれらの実装を提供しました。

@Transactional
@Component
@Repository
public abstract class GenericDAOHibernate4<E, PK extends Serializable> implements GenericDAO<E, PK> {
    public PK save(E newInstance) {
        return (PK) factory.getCurrentSession().save(newInstance);
    }
    public E findById(PK id) {
        return (E) factory.getCurrentSession().get(getEntityClass(), id);
    }
//method implementations
}

次に、この抽象クラスを拡張する具象クラスを作成する必要があります。

@Component
@Transactional
@Repository
@Qualifier("userDAO")
public class UserDAO extends GenericDAOHibernate4<User, Long> {

    @Autowired
    public UserDAO(SessionFactory factory) {
        super(factory);
    }

    @Override
    protected Class<User> getEntityClass() {
        return User.class;
    }

}

次に、必要に応じて具体的な DAO を次のように挿入します。

public class UserService extends GenericService<User> {
    @Autowired
    public UserService(@Qualifier("userDAO") GenericDAO<User, Long> dao) {
        super(dao);
    }

しかし、具象 dao に別のメソッドを追加して具象クラスを注入する必要がある場合、Spring は依存関係を見つけることができません。これは起動時に失敗します:

public class UserService extends GenericService<User> {
    @Autowired
    public UserService(@Qualifier("userDAO") UserDAO dao) {
        super(dao);
    }

このエラーで:

Bean クラス [ddol.rtdb.services.UserService] をインスタンス化できませんでした: デフォルトのコンストラクターが見つかりません。ネストされた例外は java.lang.NoSuchMethodException: ddol.rtdb.services.UserService.() です

どのように注入すればよいですか?

4

2 に答える 2

3

クラスがインターフェースを実装する場合、そのクラスの Bean は、具体的なクラス タイプではなく、インターフェース タイプを使用してのみ自動配線できます。UserDaoインターフェイスを実装しているため、インターフェイスGenericDAO<User, Long>を使用して自動配線すると、正しく自動配線されます。Spring は、具象クラスを使用して自動配線しようとすると依存関係を見つけることができず、引数のないコンストラクターをUserService探して失敗し、何も見つからないという特定のエラーが発生します。

一般に、具体的なクラスを使用して依存関係を注入することはお勧めできません。これは、モジュールを緊密に結合するためです。これを行う正しい方法は、DAO クラスごとにインターフェイスを用意し、その実装でGenericDAOHibernate4.

public interface GenericDAO<E, PK extends Serializable> {
    PK save(E newInstance);
    void update(E transientObject);
    //typical dao methods
}

public interface UserDAO extends GenericDAO<User, Long> {
    List<User> findUsersByFirstname(String firstName);
}

@Component
@Transactional
@Repository
@Qualifier("userDAO")
public class UserDAOImpl extends GenericDAOHibernate4<User, Long> 
        implements UserDAO {

    @Autowired
    public UserDAO(SessionFactory factory) {
        super(factory);
    }

    @Override
    protected Class<User> getEntityClass() {
        return User.class;
    }

    List<User> findUsersByFirstname(String firstName) {
        //provide implementation here
    }

}

public class UserService extends GenericService<User> {
    @Autowired
    public UserService(@Qualifier("userDAO") UserDAO dao) {
        super(dao);
    }
}
于 2012-09-30T18:26:45.303 に答える
0

@Autowired = タイプによる配線 @Resource = Bean 名による配線

于 2012-09-30T18:46:28.770 に答える