Spring的include-filter和exclude-filter是如何工作的?
exclude-filter好像是过滤掉不符合条件的组件不加载,但是include-filter并不是只加载某些组件。能不能详细讲解一下二者的机制?
我们来component-scan的几个属性
basePackages:Spring将扫描的基础package名,Spring会扫描该包以及其子孙包下的所有类
useDefaultFilters:默认为true,此时Spring扫描类时发现如果其被标注为
@Component
、@Repository
、@Service
、@Controller
则自动实例化为bean并将其添加到上下文中,如果设置为false,即使将其标注为@Component或者其他,Spring都会忽略includeFilters 指定扫描时需要实例化的类型,我们可以从名字看到这是一个Filter,你可以自己定义该Filter,Spring为我们提供了一套方便的实现,我们可以根据标注、类、包等相关信息决定当扫描到该类时是否需要实例化该类,需要注意的是如果你仅仅想扫描如
@Controller
不仅要加includeFilters,还需要将useDefaultFilters设置为falseexcludeFilter 指定扫描到某个类时需要忽略它,实现和上一个Filter一样,区别只是如果Filter匹配,Spring会忽略该类
这样includeFilters以及excludeFilterF的行为就很清楚了,Spring每扫描一个类,都会经过includeFilters以及excludeFilters,如果某个Filter匹配,就执行相应的操作(实例化或者忽略)
exclude-filter是对应用已经存在不符合条件的组件除外,也就是不加载,include-filter就是应用中已有的组件不能满足业务的需求,还需要加载更多的组件