SpringBoot--springboot啟動類和controller的配置
作為一個springboot初學者,在探索過程中難免遇到一些坑,邊看書邊動手,發現書本中的版本是1.0,而我使用的是最新版2.0,所以有些東西不能完全按照書本進行操作,因為2.0中已經不支持1.0中的部分配置了,比如2.0中的註解@SpringBootApplication是註解@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan的組合,而1.0中它是@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan等。而且在入門教程中將啟動類和controller放在同一個類中,但是這樣的配置隨著業務的擴展controller會越來越多,隨之而來的問題就是啟動類越來越大,考慮到這點,我想將啟動類和controller分開配置,參考網絡資源,並在一番惡鬥之後終於實現了這個想法,因為遇到了一些坑,所以必須記錄下來!!
一、controller和啟動類在同一個class中
使用IntellJ IDEA創建springboot項目時,會在默認的包下自動創建一個*Application.java的類,其中*一般是artifact名稱,即項目名稱,然後可以直接在這個類中配置controller並使用這個類啟動項目。
@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和啟動類放在一個類中的配置,直接點右鍵運行這個類就可以訪問了!
二、將controller和啟動類分開配置
因為將controller和啟動類分開,所以首先要新建一個controller類
@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方法即可,如下:
@SpringBootApplication public class MyWebdemoApplication { public static void main(String[] args) { SpringApplication.run(MyWebdemoApplication.class, args); } }
此時不改變啟動類位置,目錄如下:
此時我訪問http://127.0.0.1:8080/hello時總是包404,排除視圖文件的因素之後我將啟動類放到com.hyc下,目錄如下:
此時再重啟服務,訪問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等資源。
三、總結
綜上所述,springboot的配置有以下三種:
1、當啟動類和controller在同一類中時,需要在該類上添加註解@Controller;
2、當啟動類和controller分開時,啟動類要放在根目錄下,啟動類上只有註解@SpringBootApplication;
3、當啟動類和controller分開時,如果啟動類在某個包下,需要在啟動類中增加註解@ComponentScan,配置需要掃描的包名;
SpringBoot--springboot啟動類和controller的配置