当前位置:编程学习 > JAVA >>

Spring中使用注解解决DAO层多态问题

以下是DAO接口

public inte易做图ce IAuthenticateDAO {
    public boolean IsAvailableInTheAccount(AuthenticateVO authenticateVO);

    public boolean IsAlreadyCertified(AuthenticateVO authenticateVO);

    public void addAuthenticationInfoAndGiftLine(AuthenticateVO authenticateVO);
    
}

下面两个是实现类

public class PhoneAuthenticateDAOImpl implements IAuthenticateDAO {
    
    public boolean IsAvailableInTheAccount(AuthenticateVO authenticateVO) {
        return false;
    }

    public boolean IsAlreadyCertified(AuthenticateVO authenticateVO) {
        return false;
    }

    public void addAuthenticationInfoAndGiftLine(AuthenticateVO authenticateVO) {
    }
}


public class EmailAuthenticateDAOImpl implements IAuthenticateDAO {

    @Override
    public boolean IsAvailableInTheAccount(AuthenticateVO authenticateVO) {
        return false;
    }

    @Override
    public boolean IsAlreadyCertified(AuthenticateVO authenticateVO) {
        return false;
    }

    @Override
    public void addAuthenticationInfoAndGiftLine(AuthenticateVO authenticateVO) {
    }
}


这样写的话 在Service层,使用注解的方式应该怎么配? 是不是这样:

@Service("authenticateService")
public class AuthenticateServiceImpl implements IAuthenticateService {
    @Inject
    private IAuthenticateDAO phoneAuthenticateDAO;
    @Inject
    private IAuthenticateDAO emailAuthenticateDAO;
}
--------------------编程问答-------------------- 首先我想你注入的两个bean也因该交给spring管理。这样才能注入成功。 --------------------编程问答--------------------
引用 1 楼 wuda236556254 的回复:
首先我想你注入的两个bean也因该交给spring管理。这样才能注入成功。

@Repository("emailAuthenticateDAO")
public class EmailAuthenticateDAOImpl implements IAuthenticateDAO {}
这个考虑了。。 问题是我不知道是否会成功。 --------------------编程问答-------------------- 这样能够注入成功,如果是注入方式是byName。但是问题是这样就失去了多态的意义。我们要多态是想由程序在运行的时候时候决定注入哪个实现类,但是用spring的注入方式来实现多态貌似实现不了。比如:

@Repository
public class daoImpl implements dao{
@Resource
Idatabase idb;
void save(T entity){ idb.executeSQL(entity);//实现类 SaveImpl中重写的方法 }
void update(T entity){ idb.executeSQL(entity);//实现类 UpdateImpl中重写的方法 }
void remove(T entity){ idb.executeSQL(entity);//实现类 RemoveImpl中重写的方法 }
}

在以上代码我们希望由容器判断该注入什么类,但是实际上貌似不行,会抛出异常。 --------------------编程问答-------------------- 你想想如果是你  没有指定名字 你能确定
 @Inject
 private IAuthenticateDAO phoneAuthenticateDAO;
 @Inject
 private IAuthenticateDAO emailAuthenticateDAO;
这两个具体是IAuthenticateDAO的哪个实现类吗 --------------------编程问答-------------------- 除 --------------------编程问答--------------------
引用 3 楼 lsx1984 的回复:
这样能够注入成功,如果是注入方式是byName。但是问题是这样就失去了多态的意义。我们要多态是想由程序在运行的时候时候决定注入哪个实现类,但是用spring的注入方式来实现多态貌似实现不了。比如:
Java code?12345678@Repositorypublic class daoImpl implements dao{@ResourceIdatabase idb……

我觉得应该说多态的重点是在运行时决定具体实现类,这个应该是了

由谁决定可以说都是由程序决定的 --------------------编程问答-------------------- 除
补充:Java ,  Java EE
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,