假设我的接口按如下方式扩展了CrudRepository
@Repository
public interface EmployeeRepository extends CrudRepository<Employee, Integer>
{
}
我在服务类中使用EmployeeRepository接口,如下所示
@Service
public class EmployeeService
{
@Autowired
EmployeeRepository employeeRepository;
public List<Employee> getAllEmployee()
{
List<Employee> listEmp=new ArrayList<Employee>();
employeeRepository.findAll().forEach(listEmp::add);
return listEmp;
}
}
@RestController
public class WelcomeController
{
@Autowired
EmployeeService empservice;
@RequestMapping("/employees")
public List<Employee> getEmployees()
{
return empservice.getAllEmployee();
}
}
错误很明显,因为接口EmployeeRepository不是由任何类实现的,并且
@Autowired
EmployeeRepository employeeRepository;
Autowired将失败,因为没有类实现EmployeeRepository。
不过,我对它是如何工作感到困惑的,因为我在GitHub和tutorial上看到的每一个代码都能完美地工作。
关于Spring数据存储库,已经有了一个很好的答案:Spring数据存储库实际上是如何实现的?.但是,在阅读您的问题时,我认为对@autowired
的工作方式有点混淆。让我试着给出这些事件的高级顺序:
>
您将依赖关系放在代码中的EmployeeRepository
上:
@Autowired
private EmployeeRepository employeeRepository;
通过执行步骤(1),您向Spring容器指示,在其启动过程中,它应该找到实现EmployeeRepository
的类的一个实例,并将其注入@AutoWired
注释的目标。这里我想强调的是,为了使注入正常工作,您应该在运行时而不是在编译过程中让类的实例在Spring容器中实现所需的html" target="_blank">接口。
那么现在一个逻辑问题出现了:“如果我们没有显式定义实现userrepository
的类,那么它在启动过程中出现在Spring容器中的哪里”?
这是Oliver comes的详细回答:Spring数据存储库实际上是如何实现的?。简而言之,在容器引导过程中发生的是Spring数据扫描所有存储库接口;创建实现这些接口的新类(代理);将这些类的实例放入Spring容器中,这允许@autowired
查找并注入它们,就像对容器中的任何其他Spring bean所做的那样。
同样,这些过程只有在您设置了Spring数据并正确配置时才起作用,否则注入就会失败。
希望这有帮助。
我正在使用Java和Spring开发一个web应用程序。我是Spring的新手,所以作为一个学习的机会,我基本上得到了一个现有的应用程序,并被告知要扩展它。我很难理解@Autowired是如何工作的。我理解依赖注入的高级概念,但我想知道@AutoWired注释是如何知道要注入接口的哪个具体实现的? 为了使我的问题符合上下文,我将解释我所遇到的问题: 我有一个名为PostDao的接口,还有一个名为P
以下是详细情况: 我的应用程序中有多个模型,每个模型都有一个扩展Spring的< code>CrudRepository的存储库。 例如: > 具有存储库 具有存储库< code >接口HairColorModel扩展了CrudRepository 具有存储库 中扩展我的所有个人存储库时,我得到了以下错误: 那么,有没有一种方法可以完成我想做的事情,或者我只是在实例化我所有模型库的实例?
问题内容: 考虑以下代码: 由于类型擦除的限制,我收到以下错误消息: java.lang.Comparable的不能使用不同的参数继承:和 我有以下要求: 需要是一个枚举,因为我需要将其用作注释中的默认值。 我的界面的约定是,它必须具有可比性。 我已经尝试在接口中使用通用范围,但是Java不支持此功能。 问题答案: 枚举实现Comparable,因此FooImpl最终使用不兼容的参数将Compar
我遇到了一些麻烦,弄清楚如何在接口中定义构造函数。我可能完全误会了什么。但我已经寻找答案很久了,我找不到任何与此相关的东西。 如何在TypeScript类中实现以下接口: Anders Hejlsberg创建了一个界面,其中包含类似于这段视频中的内容(大约14分钟)。但我一辈子都不能在一个班级里实现这一点。 这对我来说不是编译,当我尝试编译时,我得到“类'test'声明接口'myinterface
或者特别是:两者之间的区别是什么 和 它会以任何方式影响实现类吗?
为什么它这样做,它有一个更好的做法?在sub接口中实现方法有什么区别吗?