springboot下使⽤@ConponentScan注解遇到的问题
转载⾃:
问题描述
如果你⼼急看结果,请直接到本⽂末尾
今天使⽤了注解操作spring boot,⼀开始程序⽆法启动,提⽰⽆法到⼀个注解注⼊的类,查询⽹上,有⼈说使⽤@ConponetScan注解,可以指定需要扫描的类所在的包.我试了⼀下,程序能够正常启动了,但是在浏览器端⽆法访问,提⽰404错误.程序具体代码如下: DemoApplication.java:
ample.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import t.annotation.ComponentScan;
springframework和springboot
@SpringBootApplication
@ComponentScan(basePackages="domain")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
HelloworldController.java:
ample.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包的,不知道是不是压根不能指定本项⽬的其他包.
上⾯是我之前写的,这⾥留着,给⾃⼰提个醒,产⽣问题的因素没有梳理完,不要发⽂章.
下⾯是真正的原因:
1. @ComponentScan默认扫描使⽤该注解的类所在的包,包括这个包下的类和⼦包,所以如果没有配置basepackages,并且类都放在⼦包
中,是可以正常访问的
2. 如果配置了@ComponentScn中的basepackages,那么就要把所有需要扫描的包都配置.这种情况下,@ComponentScan是不会再去扫描
当前类所在的包的.之前我之所以以为@ComponentScan对启动类之外的包⽆能为⼒,就是因为配置了domain包,但是没有配controller类的包,导致程序⽆法访问.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。