zuier 发表于 2017-2-10 12:33:03

Tomcat源码解读--代码走读之(二十一的2-1)realm.start(二十二)

  这里介绍一下realm,当前对象是LockOutRealm,类继承关系是LockOutRealmextends CombinedRealm,CombinedRealm extends RealmBase,RealmBase extendsLifecycleMBeanBase implements Realm,LifecycleMBeanBaseextends LifecycleBase implements MBeanRegistration,LifecycleBaseimplements Lifecycle。
  LockOutRealm间接继承了LifecycleBase,所以调用父类的start方法,里面的主要步骤为。
  1、init方法进行初始化,
  (1)、因为LockOutRealm的listeners为0,所以setStateInternal(LifecycleState.INITIALIZING, null, false)方法里面没有动作。
  (2)、调用initInternal()方法就是调用RealmBase的initInternal()方法,里面的内容为调用LifecycleMBeanBase的initInternal()进行mbean注册。
  (3)、因为LockOutRealm的listeners为0,所以setStateInternal(LifecycleState.INITIALIZED, null, false)方法里面没有动作。
  2、setStateInternal(LifecycleState.STARTING_PREP,null, false),LockOutRealm的listeners为0,所以此阶段没有动作。
  3、startInternal(),为LockOutRealm的startInternal()方法,
  (1)、主要是定义了一个LinkedHashMap对象faileUsers,之后调用父类CombinedRealm的startInternal()方法。
  (2)、调用CombinedRealm的startInternal()方法。如下图,内容主要是进行UserDatabaseRealm的start()。UserDatabaseRealm extends RealmBase 。所以为LifecycleBase的start()方法如下。
  

 
  1)、init方法,UserDatabaseRealm的listeners为0,所以一些方法没有动作执行,之后调用RealmBase的initInternal()方法,内容主要为调用LifecycleMBeanBase的initInternal()方法,主要是注册mbean。
  2)、setStateInternal(LifecycleState.STARTING_PREP, null, false),UserDatabaseRealm的listeners为0所以没有执行动作。
  3)、startInternal(),是调用UserDatabaseRealm的startInternal(),如下图,UserDatabaseRealm的属性赋值database = (UserDatabase) context.lookup(resourceName)。之后调用父类RealmBase的startInternal()方法,UserDatabaseRealm的listeners为0,所以没有执行动作。
  

 
  4)、setStateInternal(LifecycleState.STARTED, null, false),UserDatabaseRealm的listeners为0所以没有执行动作。
  承接(2)步骤,LockOutRealm对象调用super.startInternal()方法,所以就是调用RealmBase的startInternal()方法如下图。因为LockOutRealm的listenrs为0,所以没有执行动作。
  

 
  4、setStateInternal(LifecycleState.STARTED,null, false),LockOutRealm的listeners为0,所以此阶段没有动作。
页: [1]
查看完整版本: Tomcat源码解读--代码走读之(二十一的2-1)realm.start(二十二)