Spring 經過註解定義Bean以及自動掃描註解定義的bean ComponentScan 自動掃描組件&指定掃描規則

無論是xml仍是註解,他們都是表達bean定義的載體,其實質都是爲Spring容器提供Bean定義的信息,在表現形式上都是講xml定義的內容經過類註解進行描述。spring

Spring容器成功啓動的三大要件分別爲:bean定義信息,bean實現類,spring自己。
若是採用基於xml的配置,則bean定義信息和bean實現類自己是分離的;而若是採用基於註解的配置文件,則bean定義信息經過在bean實現類上標註註解實現。ui

@Controller:用於對Controller實現類進行標註
@Repository:用於對DAO實現類精心標註
@Service:用於對Service實現類進行標註xml

Spring提供了一個context命名空間,他提供了經過掃描類包以應用註解定義Bean的方式。
若是僅但願掃描特定的類而非基包下的全部類,那麼能夠使用resource-pattern屬性過濾出特定的類。
include-filter表示要包含的目標類,而exclude-filter表示要排除的目標類。use-default-filter屬性,其默認值爲true,表示默認會對標註@Component,@Controller,@Service,@Reposity的Bean進行掃描。blog

組件註冊-@ComponentScan-自動掃描組件&指定掃描規則
之前的xml配置,是須要作包掃描的:
只要是標註了@Controller,@Service,@Repository,@Component的組件,都會被掃描進容器中。
xml中添加的配置信息爲:
it

經過註解的方式,自動掃描組件
@ComponentScan(value="com.atguigu") value表示要掃描包com.atguigu,其中,com.atguigu是包名
excludeFilters 表示過濾器,掃描的時候,在該過濾器中的組件將會排出在spring容器外。
excludeFilters ={@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Service.class,Controller.class})}
這句話表示,Service,Controller這兩個組件將會排除在spring容器外
type表示過濾的類型,這裏用的是FilterType.ANNOTATION,表示按照註解排除class

下面咱們看運行結果:
沒排除前(也就是沒加過濾器,以及use-default-filter=true),spring容器中的組件爲:
容器

增長過濾器後excludeFilters ={@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Service.class,Controller.class})},spring容器中的組件爲:
gui

從上面的比對結果能夠看出,excludeFilters 將Service,Controller都過濾在spring容器外了。配置

excludeFilters 表示掃描的時候,按照必定規則,排除哪些組件
includeFilters 表示掃描的時候,只須要包含哪些組件命名空間

只有禁用默認規則(默認規則表示掃描全部組件),includeFilters纔會生效。useDefaultFilters = false
增長includeFilters後,輸出爲:
@ComponentScan(value = "com.atguigu", includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = { Controller.class})},useDefaultFilters = false)
增長過濾器includeFilters 後,輸出爲:

相關文章
相關標籤/搜索