問題描述
如果你心急看結果,請直接到本文末尾
今天使用了注解操作spring boot,一開始程序無法啟動,提示無法找到一個注解注入的類,查詢網上,有人說使用@ConponetScan注解,可以指定需要掃描的類所在的包.我試了一下,程序能夠正常啟動了,但是在瀏覽器端無法訪問,提示404錯誤.程序具體代碼如下:
DemoApplication.java:
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan(basePackages="domain")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
HelloworldController.java:
package com.example.demo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import domain.User;
@RestController
//@RequestMapping("/web")
public class HelloworldController {
@Autowired
User user;
@RequestMapping("/getUser")
public User getUser(){
//User user = new User();
user.setName("jack");
user.setPwd("pwd");
return user;
}
}
User.java:
package domain;
//@Component
@Service()
public class User implements Serializable{
private static final long serialVersionUID = 1L;
private String name;
private String pwd;
...
}
程序要點
我在controller類中注入bean類@Autowired User user;,並且在springboot 的application類中指定了掃描User類所在的包 @ComponentScan(basePackages="domain").而且User類也指定了@Service注解.
啟動springboot,沒有錯誤,在瀏覽器打開,提示404錯誤.
結果分析
具體原因不知道,但是如果把User類放在與application類同一目錄下,把application類中的@ComponentScan注解去除,其他不需要改變就能正常訪問.
我嘗試了很多,發現@ComponentScan注解對本項目下的別的目錄無能無力,如果把application類放在頂級目錄下,一般放在{groupId}.{artifactId}目錄下.其他類放在這個目錄或者它的子目錄下,就可以在不使用@ComponentScan注解的情況下使用注解(如@Autowired,@Service).因為spring boot 默認掃描
application啟動類所在的目錄及其子目錄下的注解.但是如果把使用注解的類放在application類所在目錄之外的目錄中,即使使用@ConponentScan注解指定了類所在的目錄,也不能正常使用.網上很多說@ComponentScan注解是用於掃描引入的別的模塊或jar包的,不知道是不是壓根不能指定本項目的其他包.
上面是我之前寫的,這里留着,給自己提個醒,產生問題的因素沒有梳理完,不要發文章.
下面是真正的原因:
- @ComponentScan默認掃描使用該注解的類所在的包,包括這個包下的類和子包,所以如果沒有配置basepackages,並且類都放在子包中,是可以正常訪問的
- 如果配置了@ComponentScn中的basepackages,那么就要把所有需要掃描的包都配置.這種情況下,@ComponentScan是不會再去掃描當前類所在的包的.之前我之所以以為@ComponentScan對啟動類之外的包無能為力,就是因為配置了domain包,但是沒有配controller類的包,導致程序無法訪問.
以上問題僅限於本人環境下的,如果有出入,輕噴
