一、什麼是basepackages
在使用Java開發框架時,我們需要使用大量的類和包。本質上,姑且可以把包代入為類的集合體,是為Java中位於同一層次、功能相近的類的集合。如:
org.springframework.boot.autoconfigure.web.servlet
這個包下面有DispatcherServletAutoConfiguration類,它背後有下面兩個類:
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration;
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter;
在Spring Boot中,當我們沒有配置任何Configure類時,都是使用一些默認的配置。默認的過程就是通過配置類來完成的,在Spring Boot中,對於以上兩個類就可以將它們看作是默認配置類。
這樣,Spring Boot就知道了我們需要使用Web MVC這個框架,並且自動配置了相關的資源。
二、為什麼要設置basepackages
在Spring Boot中,我們可以使用註解@Import來引入配置文件,也可以使用@ImportResource來引入XML文件,並且我們也可以使用@ComponentScan來掃描一些@Component註解的類,但是對於某些等級關係,或者優先順序搭配較為複雜的bean,我們還需要使用@Configuration註解的配置類來進行註冊。
這時候,我們需要設置basepackages這個屬性來掃描我們@Configuration註解的配置類所在的包,讓Spring Boot能夠自動將它們註冊成bean。
示例如下:
@Configuration
@ComponentScan(basePackages = {"com.example.demo"})
public class ExampleConfiguration {
// ...
}
三、如何設置basepackages
設置basepackages是比較簡單的,我們在@Configuration註解的配置類上面添加@ComponentScan註解,並設置basePackages屬性即可。
示例如下:
@Configuration
@ComponentScan(basePackages = {"com.example.demo"})
public class ExampleConfiguration {
// ...
}
這個例子中,Spring Boot會掃描com.example.demo包下的所有類,然後自動註冊成bean。
四、使用多個basepackages
有時候,我們需要同時跨多個包進行掃描,這時候就需要設置多個basepackages了。
示例如下:
@Configuration
@ComponentScan(basePackages = {"com.example.demo.controller", "com.example.demo.service"})
public class ExampleConfiguration {
// ...
}
這個例子中,Spring Boot會掃描com.example.demo.controller和com.example.demo.service包下的所有類,並自動註冊成bean。
五、過濾不需要掃描的包
如果在某個較大的包下,有一些我們不想被Spring Boot掃描到的類,那麼我們可以使用excludeFilters來進行排除。
示例如下:
@Configuration
@ComponentScan(basePackages = {"com.example.demo"}, excludeFilters = {
@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = {MyBeanToIgnore1.class, MyBeanToIgnore2.class})
})
public class ExampleConfiguration {
// ...
}
這個例子中,Spring Boot會掃描com.example.demo包下的所有類,除了MyBeanToIgnore1和MyBeanToIgnore2,這兩個類將不會被自動註冊成bean。
六、總結
在Spring Boot中,basepackages是非常重要的一個屬性,它能夠讓我們方便的進行bean的自動註冊,並且支持多個basepackages的設置,如果我們需要對某些包或類進行過濾,還可以使用excludeFilters屬性來進行排除操作。
原創文章,作者:FOFB,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/138425.html