如何写一个给自己的框架写一个优雅的Java Config模块(四)

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对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈振阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值