1. 程式人生 > >如何寫一個給自己的框架寫一個優雅的Java Config模組(一)

如何寫一個給自己的框架寫一個優雅的Java Config模組(一)

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