【问题标题】:Spring @Autowired: how autowiring interface works [duplicate]Spring @Autowired:自动装配接口如何工作[重复]
【发布时间】:2021-08-06 01:54:11
【问题描述】:

请帮助我了解当实现类扩展另一个类时,自动装配如何与 Spring 中的接口一起工作。由于我们无法在Java中为接口创建对象,我的理解是Spring在使用@Autowired注解时会注入实现类的实例。在以下情况下,为什么在 TestServiceImpl 中自动装配 TestDAO 时无法调用继承方法( TestDAOImpl->save() )?

Interface CommonDAO
{
    
    save();
}

Class CommonDAOImpl implements CommonDAO
{
    
    // define save();
}



Interface TestDAO

{
    
    User createUser ()
}

class TestDAOImpl extends CommonDaoImpl{
    
    //define createUser()
}


class TestServiceImpl implements TestService{
    
    @Autowired
    TestDAO testDao

    public User createUser(){
    //Able to call testDao.createUser();
    //Why I am not able to call call testDao.save()?
    //what is actually happening when autowiring interface? Spring not injecting instance for TestDAOImpl in this case?
    }

}

【问题讨论】:

  • 您的示例不起作用。您有一个类试图“实现”另一个类,并且您有两个不相关的接口。 (类实现接口AB 的事实并不意味着如果您将其变量声明为A,您也会看到B 方法。)
  • 我认为你必须 @Autowired 使用 TestDAOImpl 类,而不是接口。而mapper-config.xml 会搜索所有DAO,并与sql mapper xmls 绑定
  • 你的班级只知道TestDAO它不知道TestDAOImpl。由于TestDAO 不是CommonDAO,因此save 方法不可用,无论使用哪种实现。
  • 这与 Spring 无关,而只是接口在 Java 中的工作方式。做你想做的事,你要么需要注入CommonDAO,要么确保TestDAO扩展CommonDAO

标签: java spring interface autowired


【解决方案1】:

你说的是DAO层的二维,但是你只使用了其中一个,并且它们没有任何关联(继承、扩展、内部调用),以确保你理解范围和内部类之间的接口范围概念稍后再试,比如可以让一个子类继承CommonDAO,同时继承TestDAO,虽然这不符合单一职责原则,但是为了让大家更好理解,可以试试

【讨论】:

    猜你喜欢
    • 2018-09-29
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 2011-03-10
    相关资源
    最近更新 更多