@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分開配置,參考網絡資源,並在一番惡斗之后終於實現了這個想法,因為遇到了一些坑,所以必須記錄下來!!

一、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,配置需要掃描的包名;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM