解释Spring中的@service是如何工作的

时间:2018-03-13 12:48:00

标签: spring-boot service

我跟随老师,但我有些困惑。这是一个从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

的任何地方

3 个答案:

答案 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已经构建了TaskRepositoryTaskService个对象。它只会将TaskService对象注入控制器的自动装配taskService变量。