Builder
XBuilder:顶级接口,提供build方法;
AbstractXBuilder:XBuilder的一级抽象实现,提供一个builder只构建一次的机制
AbstractConfiguredXBuilder:开发一个Builder一般要继承这个,这个Builder的抽象实现,提供了将一个Builder的配置分成各个Configurer的方法,各个Configurer各司其职,架构更清晰,比如说各种apply方法。
XConfigurer
XConfigurer:跟AbstractConfiguredXBuilder的子类配合,一个XConfigurer配置一个Builder的一个小模块。
XConfigurerAdapter:XConfigurer的适配器,要想实现一个XConfigurer,可以继承XConfigurerAdapter,只实现自己感兴趣的方法,同时提供了在XConfigurer的实现中获取到所属的Builder的功能,具体表现就是,继承了这个XConfigurerAdapter的实现可以自带and()返回到Builder的功能。
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的引用;
- 首先使用AutowiredWebSecurityConfigurersIgnoreParents获取到所有自定义配置的ConfigurerAdapter对象,然后将这些自定义的配置,apply到Configuration引用的Builder对象中(这里注意,这个Builder对象在Configuration中,可以直接new,然后后处理一下,不用注入)。
- 调用Builder的build方法,构建对象,然后在Configuration中一个@Bean标识的方法中暴露出去。
- Configuration持有逻辑上顶级的Builder的引用,使用Builder的 build方法的返回对象做进一步的操作,直接暴露出去,还是在进行一些其他的包装之类的操作,在暴露出去。
- 感受下WebSecurityConfiguration中定义的Bean:DelegatingApplicationListener对象、SecurityExpressionHandler对象、WebInvocationPrivilegeEvaluator对象、AutowiredWebSecurityConfigurersIgnoreParents对象,还有最最重要的webSecurity.build()方法的结果,一个FileChainProxy对象。