1. 程式人生 > >SpringBoot--springboot啟動類和controller的配置

SpringBoot--springboot啟動類和controller的配置

bubuko 部分 web 掃描 技術分享 sin con style 正常

作為一個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的配置