您的位置:

探究basepackages

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