如何寫一個給自己的框架寫一個優雅的Java Config模組(一)
阿新 • • 發佈:2019-01-22
Build設計模式
配置模組化
用build設計模式將配置模組化。
配置的依賴關係管理
主從模式
可以暫時先看下面的主從從模式。
單屬性配置
httpSecurity.authorizeRequests().regexMatchers("/url/**").authenticated().regexMatchers("/url2/**").anonymous();
上邊的程式碼authorizeRequests方法返回的是一個ExpressionUrlAuthorizationConfigurer物件,regexMatchers方法返回一個AuthorizedUrl物件,這個物件有很多設定許可權的方法,但是這個物件的所有方法能且只能被呼叫一次。Spring Security用來控制只能被呼叫一次的方法就是不管呼叫AuthorizedUrl物件的哪個方法,接著返回ExpressionUrlAuthorizationConfigurer物件。
主從從模式
httpSecurity.sessionManagement().maximumSessions(10).expiredUrl("someurl").and().sessionFixation();
上邊的程式碼分解如下:
SessionManagementConfigurer<HttpSecurity> sessionManagementConfigurer = httpSecurity.sessionManagement();
ConcurrencyControlConfigurer concurrencyControlConfigurer = sessionManagementConfigurer.maximumSessions (10);
concurrencyControlConfigurer = concurrencyControlConfigurer.expiredUrl("someurl");
sessionManagementConfigurer = concurrencyControlConfigurer.and();
sessionManagementConfigurer.sessionFixation();
要有從任何一個子模組回到上一個模組的方式。
使用泛型配置配置的依賴關係
正確使用泛型,可以讓一個子模組同時配置到多個類似的父模組。
<http>
<cors configuration-source-ref ="test" ref="test"/>
</http>
<cors configuration-source-ref="test" ref="test"/>
如上,cors這個配置可以同時存在於兩個不同的父元素中。
Spring Security中使用了大量的泛型很好的處理了這個問題。
public class CorsConfigurer<H extends HttpSecurityBuilder<H>>
extends AbstractHttpConfigurer<CorsConfigurer<H>, H>
public abstract class AbstractHttpConfigurer<T extends AbstractHttpConfigurer<T, B>, B extends HttpSecurityBuilder<B>>
extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, B>
public abstract class SecurityConfigurerAdapter<O, B extends SecurityBuilder<O>>
implements SecurityConfigurer<O, B>
build方法的正確姿勢(init,configure)
特定位置預留擴充套件點,同時提供構建狀態的資訊。
public final O build() throws Exception {
if (this.building.compareAndSet(false, true)) {
this.object = doBuild();
return this.object;
}
throw new AlreadyBuiltException("This object has already been built");
}
protected final O doBuild() throws Exception {
synchronized (configurers) {
buildState = BuildState.INITIALIZING;
beforeInit();
init();
buildState = BuildState.CONFIGURING;
beforeConfigure();
configure();
buildState = BuildState.BUILDING;
O result = performBuild();
buildState = BuildState.BUILT;
return result;
}
}
執行時資訊
與框架或者中介軟體的非配置模組互動的正確姿勢
//TODO
提供一個配置介面卡供使用者繼承過載
類似Spring Security的WebSecurityConfigurerAdapter,在裡面提供的內容如下:
1. 各個配置項的預設配置
2. 頂級配置項的配置過載回撥方法
3. 重要配置項的配置方法,比如各種頂級概念的bean