不管是xml還是注解,他們都是表達bean定義的載體,其實質都是為Spring容器提供Bean定義的信息,在表現形式上都是講xml定義的內容通過類注解進行描述。
Spring容器成功啟動的三大要件分別為:bean定義信息,bean實現類,spring本身。
如果采用基於xml的配置,則bean定義信息和bean實現類本身是分離的;而如果采用基於注解的配置文件,則bean定義信息通過在bean實現類上標注注解實現。
@Controller:用於對Controller實現類進行標注
@Repository:用於對DAO實現類精心標注
@Service:用於對Service實現類進行標注
Spring提供了一個context命名空間,他提供了通過掃描類包以應用注解定義Bean的方式。
如果僅希望掃描特定的類而非基包下的所有類,那么可以使用resource-pattern屬性過濾出特定的類。
include-filter表示要包含的目標類,而exclude-filter表示要排除的目標類。use-default-filter屬性,其默認值為true,表示默認會對標注@Component,@Controller,@Service,@Reposity的Bean進行掃描。
組件注冊-@ComponentScan-自動掃描組件&指定掃描規則
以前的xml配置,是需要做包掃描的:
只要是標注了@Controller,@Service,@Repository,@Component的組件,都會被掃描進容器中。
xml中添加的配置信息為:
通過注解的方式,自動掃描組件
@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,表示按照注解排除
下面我們看運行結果:
沒排除前(也就是沒加過濾器,以及use-default-filter=true),spring容器中的組件為:
增加過濾器后excludeFilters ={@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Service.class,Controller.class})},spring容器中的組件為:
從上面的比對結果可以看出,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 后,輸出為: