我跟随老师,但我有些困惑。这是一个从Spring数据扩展CrudRepository的接口
import org.springframework.data.repository.CrudRepository;
public interface TaskRepository extends CrudRepository<Task,Integer>{
}
这是类服务使用的接口:
@Service
@Transactional
public class TaskService {
private final TaskRepository taskRepository;
public TaskService(TaskRepository taskRepository) {
this.taskRepository = taskRepository;
}
public List<Task> findAll(){
List<Task> tasks = new ArrayList<>();
for(Task task : taskRepository.findAll()) {
tasks.add(task);
}
return tasks;
}
}
当控制器想要使用TaskService的实例时,我感到很困惑。它只是声明如下:
@Autowired
private TaskService taskService;
谁能解释我是如何运作的? TaskService的init将TaskRepository作为参数。但我找不到init TaskRepository
的任何地方答案 0 :(得分:0)
对于您的示例,您可以省略构造函数的@Autowired,因为您的服务只有一个构造函数。
JPA Repositoriy接口,TaskRepository将通过spring boot自动初始化。
答案 1 :(得分:0)
如果找到,Spring boot将自动初始化JPA Repositoriy接口。
默认情况下,Spring Boot将启用JPA存储库支持并查看@SpringBootApplication所在的包(及其子包)。如果您的配置包含位于包中的JPA存储库接口定义,则可以使用@EnableJpaRepositories及其类型安全的basePackageClasses = MyRepository.class参数指出备用包。
https://spring.io/guides/gs/accessing-data-jpa/
此外,自Spring Framework 4.3起,如果只有一个构造函数,它将尝试进行自动装配。
https://spring.io/blog/2016/03/04/core-container-refinements-in-spring-framework-4-3
答案 2 :(得分:0)
使用@Component
或其中任何变体(例如@Service
/ @Repository
/ @Controller
标记您的课程后,您将其对象管理委派给春天
通过
@Autowired
private TaskService taskService;
你告诉spring,在创建控制器的对象时,首先创建TaskService的对象并将其分配给控制器中声明的taskService
变量。
然后spring将尝试创建TaskService
的对象,但在创建时,它会看到构造函数
public TaskService(TaskRepository taskRepository) {
this.taskRepository = taskRepository;
}
因此,它现在会尝试创建TaskRepository
的对象,因为如果没有它,TaskService
对象就无法创建。
现在,TaskRepository
是扩展CrudRepository
的接口,无法实例化接口。 Spring创建一个实现TaskRepository
的代理,创建对象并将其注入taskRepository
构造函数的TaskService
。
到目前为止,spring已经构建了TaskRepository
,TaskService
个对象。它只会将TaskService
对象注入控制器的自动装配taskService
变量。