打字猴:1.700448371e+09
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){
1700448411
1700448412 return m.getName().startsWith(“init”)//init开始
1700448413
1700448414 &&Modifer.isPublic(m.getModifers())//公开方法
1700448415
1700448416 &&m.getReturnType().equals(Void.TYPE)//返回值是void
1700448417
1700448418 &&!m.isVarArgs()//输入参数为空
1700448419
1700448420 &&!Modifer.isAbstract(m.getModifers());//不能是抽象方法
[ 上一页 ]  [ :1.700448371e+09 ]  [ 下一页 ]