问题描述
如果你心急看结果,请直接到本文末尾
今天使用了注解操作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类的包,导致程序无法访问.
以上问题仅限于本人环境下的,如果有出入,轻喷