Builder

XBuilder:顶级接口,提供build方法;

public interface XBuilder<O> {
O build() throws Exception;
}

AbstractXBuilder:XBuilder的一级抽象实现,提供一个builder只构建一次的机制

AbstractConfiguredXBuilder:开发一个Builder一般要继承这个,这个Builder的抽象实现,提供了将一个Builder的配置分成各个Configurer的方法,各个Configurer各司其职,架构更清晰,比如说各种apply方法。

XConfigurer

XConfigurer:跟AbstractConfiguredXBuilder的子类配合,一个XConfigurer配置一个Builder的一个小模块。

/**
* Allows for configuring a {@link XBuilder}. All {@link XConfigurer}
* first have their {@link #init(XBuilder)} method invoked. After all
* {@link #init(XBuilder)} methods have been invoked, each
* {@link #configure(XBuilder)} method is invoked.
*
* @author chenzhenyang
* @since 0.0.1
*
* @param <O>
* The object being built by the {@link XBuilder} B
* @param <B>
* The {@link XBuilder} that builds objects of type O. This is
* also the {@link XBuilder} that is being configured.
*/
public interface XConfigurer<O, B extends XBuilder<O>> {

/**
* Initialize the {@link XBuilder}. Here only shared state should be
* created and modified, but not properties on the {@link XBuilder}
* used for building the object. This ensures that the
* {@link #configure(XBuilder)} method uses the correct shared objects
* when building.
*
* @param builder
* @throws Exception
*/
void init(B builder) throws Exception;

/**
* Configure the {@link XBuilder} by setting the necessary properties
* on the {@link XBuilder}.
*
* @param builder
* @throws Exception
*/
void configure(B builder) throws Exception;
}

XConfigurerAdapter:XConfigurer的适配器,要想实现一个XConfigurer,可以继承XConfigurerAdapter,只实现自己感兴趣的方法,同时提供了在XConfigurer的实现中获取到所属的Builder的功能,具体表现就是,继承了这个XConfigurerAdapter的实现可以自带and()返回到Builder的功能。

    /**
* Return the {@link SecurityBuilder} when done using the
* {@link SecurityConfigurer}. This is useful for method chaining.
*
* @return
*/
public B and() {
return getBuilder();
}

Adapter

有时候我们需要提供给开发者一个Adapter,来进行自定义的配置。一个框架,一般只会有一个逻辑上的顶级Builder,而这个对外提供的XConfigurerAdapter自己本身是一个Configurer,这个Configurer比较特殊,除了要Builder自己的东西之外,还要持有其他所有相关Builder的引用。这里要注意:
由于XConfigurerAdapter自己本身是一个Configurer,所以这个Configurer自己的Build可以通过Configurer的两个回调方法,init和build来获取,所以只需要持有其他的Builder的引用就行了。
这个XConfigurerAdapter的Builder要是逻辑上的顶层的Builder,在XConfigurerAdapter中构建Builder时会依赖其他Builder的构建出的对象。

Configuration

持有顶级的Builder的引用,在Configuration的某个@Bean方法,调用Builder的build方法,将构建好的目标Object注入到IOC容器中。当然啦,在调用Builder的builder方法之前,首先利用AutowiredWebSecurityConfigurersIgnoreParents,获取到所有的XConfigurerAdapter的实例,并apply到顶级的Builder对象中,在调用Builder的build方法,这样开发者自己的自定义配置就生效了。

默认Bean的处理手法

直接注入XConfiguration,然后调用XConfiguration的@Bean方法,获取默认的Bean,不用默认的话,用自己持有的Builder自己build一个。

启动流程

提供的Configuration是启动点。思路是我们只定义逻辑顶级Builder,依赖自己搞定。
0. Configuration持有顶级的Builder的引用;

  1. 首先使用AutowiredWebSecurityConfigurersIgnoreParents获取到所有自定义配置的ConfigurerAdapter对象,然后将这些自定义的配置,apply到Configuration引用的Builder对象中(这里注意,这个Builder对象在Configuration中,可以直接new,然后后处理一下,不用注入)。
  2. 调用Builder的build方法,构建对象,然后在Configuration中一个@Bean标识的方法中暴露出去。
  3. Configuration持有逻辑上顶级的Builder的引用,使用Builder的 build方法的返回对象做进一步的操作,直接暴露出去,还是在进行一些其他的包装之类的操作,在暴露出去。
  4. 感受下WebSecurityConfiguration中定义的Bean:DelegatingApplicationListener对象、SecurityExpressionHandler对象、WebInvocationPrivilegeEvaluator对象、AutowiredWebSecurityConfigurersIgnoreParents对象,还有最最重要的webSecurity.build()方法的结果,一个FileChainProxy对象。