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,所以此阶段没有动作。