如何写一个给自己的框架写一个优雅的Java Config模块(二)
2017-06-28 09:33
267 查看
Configurer保存配置信息
Builder将Configurer串起来,一个Builder可能保存有很多的Configurer。多个类型的Configurer,同一个类型的多个Configurer。参看:AbstractConfiguredSecurityBuilder。
Configuration使用Builder的信息,将Builder中保存的信息转化成各种Bean注入到IOC容器中。例子:WebSecurityConfiguration使用WebSecurity(一个Builder)中的信息,构建了各种相关的Bean。
这样就对了,使用Builder将Configurer串起来,然后一起传给Configuration用户构造Bean注入IOC容器中。
一般会建立一个xxxConfigurerAdapter用于将多个Builder串起来。这就是之前一直混乱的原因。
问题1:
如何将Builder中的信息传给Configuration?
答案:
Builder和其下属的Configurer是如何互相传递信息的,
Builder会持有其所有下属的Configurer的引用,所以Builder可以主动与Configurer通信。
那么Configurer是怎么获取Builder对象的信息的呢,我们看一下Configurer的定义:
可以看到,Configurer接口的两个方法的参数都是Builder,而这init和configure这两个方法都是持有此Configurer对象的引用的Builder在Builder初始化的合适的时机主动调用的。
比如在所有的Builder的上级抽象类AbstractConfiguredSecurityBuilder中有两个方法如下:
这两个方法最终会在合适的时机调用:
问题2:
AbstractConfiguredSecurityBuilder是一个可以被配置的Builder,其中有个configurers字段,类型为LinkedHashMap
O:The object being built by the {@link WeiXinBuilder} B
B: The {@link WeiXinBuilder} that builds objects of type O. This is also the {@link WeiXinBuilder} that is being configured.
只要将这两个值泛型就可以被任意的模块调用了。
tip3:
每个子模块的配置加一个and方法,用于返回当前使用的Builder对象,接着进行Builder对象级别的配置。
Builder将Configurer串起来,一个Builder可能保存有很多的Configurer。多个类型的Configurer,同一个类型的多个Configurer。参看:AbstractConfiguredSecurityBuilder。
Configuration使用Builder的信息,将Builder中保存的信息转化成各种Bean注入到IOC容器中。例子:WebSecurityConfiguration使用WebSecurity(一个Builder)中的信息,构建了各种相关的Bean。
这样就对了,使用Builder将Configurer串起来,然后一起传给Configuration用户构造Bean注入IOC容器中。
一般会建立一个xxxConfigurerAdapter用于将多个Builder串起来。这就是之前一直混乱的原因。
问题1:
如何将Builder中的信息传给Configuration?
答案:
Builder和其下属的Configurer是如何互相传递信息的,
Builder会持有其所有下属的Configurer的引用,所以Builder可以主动与Configurer通信。
那么Configurer是怎么获取Builder对象的信息的呢,我们看一下Configurer的定义:
public interface WeiXinConfigurer<O, B extends WeiXinBuilder<O>> { /** * Initialize the {@link WeiXinBuilder}. Here only shared state should be * created and modified, but not properties on the {@link WeiXinBuilder} * used for building the object. This ensures that the * {@link #configure(WeiXinBuilder)} method uses the correct shared objects * when building. * * @param builder * @throws Exception */ void init(B builder) throws Exception; /** * Configure the {@link WeiXinBuilder} by setting the necessary properties * on the {@link WeiXinBuilder}. * * @param builder * @throws Exception */ void configure(B builder) throws Exception; }
可以看到,Configurer接口的两个方法的参数都是Builder,而这init和configure这两个方法都是持有此Configurer对象的引用的Builder在Builder初始化的合适的时机主动调用的。
比如在所有的Builder的上级抽象类AbstractConfiguredSecurityBuilder中有两个方法如下:
@SuppressWarnings("unchecked") private void init() throws Exception { Collection<SecurityConfigurer<O, B>> configurers = getConfigurers(); for (SecurityConfigurer<O, B> configurer : configurers) { configurer.init((B) this); } for (SecurityConfigurer<O, B> configurer : configurersAddedInInitializing) { configurer.init((B) this); } } @SuppressWarnings("unchecked") private void configure() throws Exception { Collection<SecurityConfigurer<O, B>> configurers = getConfigurers(); for (SecurityConfigurer<O, B> configurer : configurers) { configurer.configure((B) this); } }
这两个方法最终会在合适的时机调用:
@Override 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; } }
问题2:
AbstractConfiguredSecurityBuilder是一个可以被配置的Builder,其中有个configurers字段,类型为LinkedHashMap
public interface WeiXinConfigurer<O, B extends WeiXinBuilder<O>>
O:The object being built by the {@link WeiXinBuilder} B
B: The {@link WeiXinBuilder} that builds objects of type O. This is also the {@link WeiXinBuilder} that is being configured.
只要将这两个值泛型就可以被任意的模块调用了。
tip3:
每个子模块的配置加一个and方法,用于返回当前使用的Builder对象,接着进行Builder对象级别的配置。
@Override protected DefaultSecurityFilterChain performBuild() throws Exception { Collections.sort(filters, comparator); return new DefaultSecurityFilterChain(requestMatcher, filters); }
相关文章推荐
- 如何写一个给自己的框架写一个优雅的Java Config模块(三)
- 如何写一个给自己的框架写一个优雅的Java Config模块
- 如何写一个给自己的框架写一个优雅的Java Config模块(五)
- 如何写一个给自己的框架写一个优雅的Java Config模块(一)
- 如何写一个给自己的框架写一个优雅的Java Config模块(四)
- Java&Android开源库代码剖析】のandroid-async-http(如何设计一个优雅的Android网络请求框架,同...
- 如何搭建一个基于Java Config零配置的SSM框架(无配置文件)
- C# C/S结构数据库系统框架详解(三) 如何新建一个模块(InventoryModule)[vjsdn]
- 手把手教你如何搭建一个自己的安卓快速开发框架之带你做自己的APP(三)
- 如何开发一个java开源框架-----Jvn框架之实现自定义Annotation以及拦截器(第五讲)
- 如何开发一个java开源框架-----Jvn框架之实现过滤静态文本跟参数转成实体类(第三讲)
- 构建自己的Java Web框架(二)之一个Filter引发的血案
- 手把手教你如何搭建一个自己的安卓快速开发框架之带你做自己的APP(二)
- java web开发中,jsp使用了frameset框架,如何实现整个页面跳转,并且同一个表单中可以提交两个action
- Java类加载机制——如何实现一个工程中不同模块加载不同版本的同名jar包。
- java框架学习,记录一下,给自己一个动力
- 如何用java代码访问远程web服务器(手写一个自己的httpClient)
- 如何编写一个自己的模块,并加载到内核中
- 如何开发一个java开源框架-----Jvn框架之实现参数传递跟信息返回(第二讲)
- 如何把一个自己写的外部驱动模块编译添加到内核中 来自网络