Java Idea 'org.springframework.web.client.RestTemplate' that could not be found报错及解决
1. 报错2. 解决3. 原理(@SpringBootApplication、@ComponentScan、@ServletComponentScan 和 @MapperScan 的区别)参考
1. 报错
@ServletComponentScan 与 @MapperScan同时用,可能有冲突
2. 解决
1. 1.2之后 Springboot不再自带RestTemplate 不用自动注入,可以重新创建一个
2. 主程序上添加:@SpringBootApplication + @ServletComponentScan + @Mapper
或者 @SpringBootApplication + @ServletComponentScan + @MapperScanner
3. 原理(@SpringBootApplication、@ComponentScan、@ServletComponentScan 和 @MapperScan 的区别)
@SpringBootApplication、@ComponentScan、@ServletComponentScan 和 @MapperScan 的区别
@SpringBootApplication这个注解是springboot启动类上的一个注解,是一个组合注解,主要由三个子注解组成: @SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan,它的主要作用就是标记说明这个类是springboot的主配置类,springboot可以运行这个类里面的main()方法来启动程序。
SpringBoot在没配置@ComponentScan的情况下,默认只扫描和主类处于同包及其子包下的beans(并把bean【service mapper resposioty controller 】自动注入容器)。
@ComponentScan注解 告诉Spring从哪里找到bean Spring会在应用主程序所在的包及其子包下进行全局扫描,把对应的bean注入到容器中,这里面的bean包括service mapper resposioty controller 所以在springboot程序中如果有@mapper注解的话 就不用再加mapperscan注解,springboot注解自带componentscan,会扫描到。
@MapperScan注解,@Mapper注解可以在编译之后生产对应的接口实现类,如果要每个接口都编程实现类,需要在每个接口上加上Mapper注解,比较麻烦,解决这个问题用的是@MapperScan注解,@MapperScan注解后面可以加value指定要扫描的包,即可实现mapper的注入。
可以认为 @ComponentScan扫描包含了 @Mapper,每个Mapper类上有@Mapper注解的话,就可以省略@MapperScan;
@ServletComponentScan
Servlet 三大组件 Servlet、Filter、Listener 在传统项目中需要在 web.xml 中进行相应的配置。Servlet 3.0 开始在 javax.servlet.annotation 包下提供 3 个对应的 @WebServlet、@WebFilter、@WebListener 注解来简化操作。
@WebServlet、@WebFilter、@WebListener 写在对应的 Servlet、Filter、Listener 类上作为标识,从而不需要在 web.xml 中进行配置了。
Spring Boot 应用中这三个注解(@WebServlet、@WebFilter、@WebListener)默认是不被扫描的,需要在项目启动类上添加 @ServletComponentScan 注解, 表示对 Servlet 组件扫描。