SpringSecurity------WebSecurity创建FilterChainProxy
一、WebSecurity的类层次结构图
WebSecurity是用于创建FilterChainProxy的建造器,注意我们这里都将实际的泛型信息标注出来了,这样更有利于我们理解FilterChainProxy的创建过程,下面的类结构中各个类的介绍我们一并也是明确泛型信息进行介绍的。
二、AbstractSecurityBuilder
这个类比较简单,主要作用就是持有被构造的对象,然后保证这个对象只能被创建一次,具体的构造逻辑通过模板方法交给子类处理(这里我们已经明确了泛型信息O为Filter):
import java.util.concurrent.atomic.AtomicBoolean;
/**
*这是一个SecurityBuilder的基类,它可以保证Filter只被创建一次
*/
public abstract class AbstractSecurityBuilder<Filter> implements SecurityBuilder<Filter> {
//一个原子类型的标志
private AtomicBoolean building = new AtomicBoolean();
//构造器最终船舰的对象,这里创建的其实就是FilterChainProxy
private Filter object;
/**
*使用building标志位保证Filter只被创建一次,如果创建成功后再次调用此方法会抛异常。
*
*具体的构造方法是doBuild(),他是一个提供给子类实现的模板方法
*/
@Override
public final Filter build() throws Exception {
if (this.building.compareAndSet(false, true)) {
this.object = doBuild();
return this.object;
}
throw new AlreadyBuiltException("This object has already been built");
}
/**
* 获取被创建的对象(FilterChainProxy),如果没有创建完成就调用该方法会抛异常
*/
public final Filter getObject() {
if (!this.building.get()) {
throw new IllegalStateException("This object has not been built");
}
return this.object;
}
/**
*供子类实现具体构造逻辑的模板方法
*/
protected abstract Filter doBuild() throws Exception;
}