在Spring框架中有這樣一個標簽元素:
這個標簽的意思就是:
在xml配置了這個標簽後,spring可以自動去掃描base-pack下面或者子包下面的java文件, 如果掃描到有@Component @Controller@Service等這些注解的類,則把這些類注冊為bean。
在這裡我的包名是com.qunar.flight.interb2b.dubbodemo.task
可以知道在這個包名下一定有一些類加入了Component 注解,如下:
import org.slf4j.Logger;
import org.springframework.stereotype.Component;
import qunar.tc.qschedule.config.QSchedule;
import qunar.tc.schedule.TaskHolder;
import qunar.tc.schedule.TaskMonitor;
@Component
public class QScheduleDemoTask {
private static final int BATCH = 100;
@QSchedule(f.inter_b2b.dubbodemo.demotask)
public void processOrders() {
}
}
注意:
如果配置了
那麼
標簽就可以不用再xml中配置了,因為前者包含了後者。
另外還提供了兩個子標簽
1.
2.
在說明這兩個子標簽前,先說一下
有一個use-default-filters屬性,改屬性默認為true,這就意味著會掃描指定包下的全部的標有@Component的類,並注冊成bean.也就是@Component的子注解@Service,@Reposity等。所以如果僅僅是在配置文件中這麼寫
Use-default-filter此時為true那麼會對base-package包或者子包下的所有的進行java類進行掃描,並把匹配的java類注冊成bean。
可以發現這種掃描的粒度有點太大,如果你只想掃描指定包下面的Controller,該怎麼辦?此時子標簽
就起到了勇武之地。如下所示
這樣就會只掃描base-package指定下的有@Controller下的java類,並注冊成bean
但是因為use-dafault-filter在上面並沒有指定,默認就為true,所以當把上面的配置改成如下所示的時候,就會產生與你期望相悖的結果(注意base-package包值得變化)
此時,spring不僅掃描了@Controller,還掃描了指定包所在的子包service包下注解@Service的java類
此時指定的include-filter沒有起到作用,只要把use-default-filter設置成false就可以了。這樣就可以避免在base-packeage配置多個包名這種不是很優雅的方法來解決這個問題了。
另外在我參與的項目中可以發現在base-package指定的包中有的子包是不含有注解了,所以不用掃描,此時可以指定來進行過濾,說明此包不需要被掃描。綜合以上說明
Use-dafault-filters=”false”的情況下:指定的不掃描,指定的掃描