1700448361
1700448362
protected abstract void doInit();
1700448363
1700448364
}
1700448365
1700448366
这里定义了一个抽象模板类AbsPopulator,它负责数据初始化,但是具体要初始化哪些数据则是由doInit方法决定的,这是一个抽象方法,子类必须实现,我们来看一个用户表数据的加载:
1700448367
1700448368
public class UserPopulator extends AbsPopulator{
1700448369
1700448370
protected void doInit(){
1700448371
1700448372
/*初始化用户表,如创建、加载数据等*/
1700448373
1700448374
}
1700448375
1700448376
}
1700448377
1700448378
该系统在启动时,查找所有的AbsPopulator实现类,然后dataInitialing实现数据的初始化。那读者可能要想了,怎么让容器知道这个AbsPopulator类呢?很简单,如果是使用Spring作为IoC容器的项目,直接在dataInitialing方法上加上@PostConstruct注解,Spring容器启动完毕后会自动运行dataInitialing方法,由于这里的原理超出了本书的范畴,不再赘述。
1700448379
1700448380
现在的问题是:初始化一张User表需要非常多的操作,比如先建表,然后筛选数据,之后插入,最后校验,如果把这些都放到一个doInit方法里会非常庞大(即使提炼出多个方法承担不同的职责,代码的可读性依然很差),那该如何做呢?又或者doInit是没有任何的业务意义的,是否可以起一个优雅而又动听的名字呢?
1700448381
1700448382
答案是我们可以使用反射增强模板方法模式,使模板方法实现对一批固定规则的基本方法的调用。代码是最好的交流语言,我们看看怎么改造AbsPopulator类,代码如下:
1700448383
1700448384
public abstract class AbsPopulator{
1700448385
1700448386
//模板方法
1700448387
1700448388
public final void dataInitialing()throws Exception{
1700448389
1700448390
//获得所有的public方法
1700448391
1700448392
Method[]methods=getClass().getMethods();
1700448393
1700448394
for(Method m:methods){
1700448395
1700448396
//判断是否是数据初始化方法
1700448397
1700448398
if(isInitDataMethod(m)){
1700448399
1700448400
m.invoke(this);
1700448401
1700448402
}
1700448403
1700448404
}
1700448405
1700448406
}
1700448407
1700448408
//判断是否是数据初始化方法,基本方法鉴别器
1700448409
1700448410
private boolean isInitDataMethod(Method m){
[
上一页 ]
[ :1.700448361e+09 ]
[
下一页 ]