写shiro的入门程序的时候有
SecurityUtils.setSecurityManager(securityManager);
Subject subject = SecurityUtils.getSubject();
对涉及的三个类的关系产生了好奇。
打开SecurityUtils,发现Subject和SecurityManager并没有什么关系。
但是网上说Subject是由SecurityManager管理的。于是更好奇了。发现有一个奇怪的东东:
打开Builder发现它是Subject接口的内部类。
Builder内部维护了SecurityManager并且在初始化的时候,调用了SecurityUtils的getSecurityManger类,给securityManger赋值了。然后在buildSubject方法中调用了securityManger的createSubject方法去创建Subject。
SecurityManager是一个接口,默认的实现类是DefaultSecurityManger,内部维护了一个SubjectFactory(默认实现类为DefaultSubjectFactory)来创建Subject。