做爲一個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,配置須要掃描的包名;