一、什么是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属性来进行排除操作。