@ComponentScan springboot启动类配置扫描

做为一个springboot初学者,在探索过程当中不免遇到一些坑,边看书边动手,发现书本中的版本是1.0,而我使用的是最新版2.0,因此有些东西不能彻底按照书本进行操做,由于2.0中已经不支持1.0中的部分配置了,好比2.0中的注解@SpringBootApplication是注解@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan的组合,而1.0中它是@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan等。并且在入门教程中将启动类和controller放在同一个类中,可是这样的配置随着业务的扩展controller会愈来愈多,随之而来的问题就是启动类愈来愈大,考虑到这点,我想将启动类和controller分开配置,参考网络资源,并在一番恶斗以后终于实现了这个想法,由于遇到了一些坑,因此必须记录下来!!java

1、controller和启动类在同一个class中spring

使用IntellJ IDEA建立springboot项目时,会在默认的包下自动建立一个*Application.java的类,其中*通常是artifact名称,即项目名称,而后能够直接在这个类中配置controller并使用这个类启动项目。springboot

复制代码
@Controller
@SpringBootApplication
public class WebdemoApplication {

    @RequestMapping("/")
    public String index(Model model) {
        Person person = new Person("张三", 26);

        List<Person> people = new ArrayList<>();
        Person p1 = new Person("李四", 27);
        Person p2 = new Person("王五", 27);
        Person p3 = new Person("赵六", 27);
        people.add(p1);
        people.add(p2);
        people.add(p3);

        model.addAttribute("singlePerson", person);
        model.addAttribute("people", people);
        return "/hello/index";
    }

    public static void main(String[] args) {
        SpringApplication.run(WebdemoApplication.class, args);
    }
}
复制代码

这就是将controller和启动类放在一个类中的配置,直接点右键运行这个类就能够访问了!网络

2、将controller和启动类分开配置mvc

由于将controller和启动类分开,因此首先要新建一个controller类app

复制代码
@Controller
public class HelloController {

    @RequestMapping("/hello")
    public String index(Model model) {
        Person person = new Person("张三", 26);

        List<Person> people = new ArrayList<>();
        Person p1 = new Person("李四", 27);
        Person p2 = new Person("王五", 27);
        Person p3 = new Person("赵六", 27);
        people.add(p1);
        people.add(p2);
        people.add(p3);

        model.addAttribute("singlePerson", person);
        model.addAttribute("people", people);
        return "/hello/index";
    }
}
复制代码

我不改变启动类的位置,可是启动类中只要一个main方法便可,以下:spa

复制代码
@SpringBootApplication
public class MyWebdemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyWebdemoApplication.class, args);
    }
}
复制代码

此时不改变启动类位置,目录以下:code

此时我访问http://127.0.0.1:8080/hello时老是包404,排除视图文件的因素以后我将启动类放到com.hyc下,目录以下:blog

此时再重启服务,访问http://127.0.0.1:8080/hello时才正常了!教程

因此这种方式必定要将启动类放在root目录下,这样才能扫描到controller、service,若是想让启动类放在任何地方都生效的话,可使用下面的配置方法

复制代码
@ComponentScan(basePackages = {"com.hyc"})
@SpringBootApplication
public class WebdemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(WebdemoApplication.class, args);
    }
}
复制代码

这种方法中,controller不变,启动类放在任意包下面,我是放在建立项目默认包中,这样只需在启动类上增长注解@ComponentScan便可,其中的(basePackages = {"com.hyc"})是须要扫描的包名,能够是多个,如(basePackages = {"com.hyc.controller","com.hyc.service"})等,这就意味着mvc容器会去这些包下面扫描,进而找到controller等资源。

3、总结

综上所述,springboot的配置有如下三种:

一、当启动类和controller在同一类中时,须要在该类上添加注解@Controller;

二、当启动类和controller分开时,启动类要放在根目录下,启动类上只有注解@SpringBootApplication;

三、当启动类和controller分开时,若是启动类在某个包下,须要在启动类中增长注解@ComponentScan,配置须要扫描的包名;

相关文章
相关标签/搜索