1. 程式人生 > >[SpringBoot] 利用spring.factories機制載入Bean

[SpringBoot] 利用spring.factories機制載入Bean

通常我們需要註冊一個bean會使用註解的形式,比如@Component註解,但是在閱讀原始碼的時候我們發現一些bean上面並沒有 該註解或者其他註冊為bean的註解,甚至沒有任何註解,這就納悶了,仔細發現它用到了spring.factories機制。 在zuul的原始碼閱讀中,找到了org.springframework.cloud.netflix.zuul.filters包下有很多已經實現好的過濾器,這些都是zuul元件進行路由轉發的關鍵,但是並沒有採用註解,如下:

package org.springframework.cloud.netflix.zuul.filters.pre;

public class DebugFilter extends ZuulFilter {

	private static final DynamicBooleanProperty ROUTING_DEBUG = DynamicPropertyFactory
			.getInstance().getBooleanProperty(ZuulConstants.ZUUL_DEBUG_REQUEST, false);

	private static final DynamicStringProperty DEBUG_PARAMETER = DynamicPropertyFactory
			.getInstance().getStringProperty(ZuulConstants.ZUUL_DEBUG_PARAMETER, "debug");

  ...省略..

}
     PS:DebugFilter 過濾器並且有新增任何註解

找到該包下的META-INF下面的spring.factories檔案,發現有如下的一行:
org.springframework.cloud.netflix.zuul.ZuulServerAutoConfiguration,
找到ZuulServerAutoConfiguration這個自動配置類,程式碼如下:

@Configuration
@EnableConfigurationProperties({ ZuulProperties.class })
@ConditionalOnClass(ZuulServlet.class)
@ConditionalOnBean(ZuulServerMarkerConfiguration.Marker.class)
// Make sure to get the ServerProperties from the same place as a normal web app would
@Import(ServerPropertiesAutoConfiguration.class)
public class ZuulServerAutoConfiguration {
    ...省略..
	@Bean
	public DebugFilter debugFilter() {
		return new DebugFilter();
	}
	 ...省略..
}

這裡面通過@Bean註解註冊了很多bean,其中就有DebugFilter,當然還有很多其他的過濾器和相關的元件,到這步如果還想知道為什麼這樣做就可以將裡面的bean註冊,就需要探究spring.facories機制的原理和載入時機了。這就不在本文詳述,這裡主要是介紹這一種方式.