程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> (context:component-scan)的使用說明

(context:component-scan)的使用說明

編輯:C++入門知識

(context:component-scan)的使用說明


在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”的情況下:指定的不掃描,指定的掃描

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved