new IniSecurityManagerFactory("classpath:shiro/first-shiro.ini");
package org.apache.shiro.config;
/**
* A Factory that creates SecurityManager instances based on Ini configuration.
*
* @since 1.0
*/
public class IniSecurityManagerFactory extends IniFactorySupport {
public static final String MAIN_SECTION_NAME = "main";
public static final String SECURITY_MANAGER_NAME = "securityManager";
public static final String INI_REALM_NAME = "iniRealm";
private ReflectionBuilder builder;
// 略
public IniSecurityManagerFactory(Ini config) {
setIni(config);
}
// new IniSecurityManagerFactory(ini文件路径),然后会调用IniSecurityManagerFactory(Ini config)
public IniSecurityManagerFactory(String iniResourcePath) {
this(Ini.fromResourcePath(iniResourcePath));
}
// 略
}
setIni(config);
调用IniFactorySupport类的setIni方法
package org.apache.shiro.config;
/**
* Base support class for Factory implementations that generate their instance(s) based on Ini configuration.
*
* @since 1.0
*/
public abstract class IniFactorySupport extends AbstractFactory {
public static final String DEFAULT_INI_RESOURCE_PATH = "classpath:shiro.ini";
private static transient final Logger log = LoggerFactory.getLogger(IniFactorySupport.class);
private Ini ini;
protected IniFactorySupport() {
}
protected IniFactorySupport(Ini ini) {
this.ini = ini;
}
public Ini getIni() {
return ini;
}
public void setIni(Ini ini) {
this.ini = ini;
}
}
package org.apache.shiro.util;
/**
* TODO - Class JavaDoc
*
* @since 1.0
*/
public abstract class AbstractFactory implements Factory {
private boolean singleton;
private T singletonInstance;
// 无参构造方法,默认会被容器加载,因此singleton标识默认为true
public AbstractFactory() {
this.singleton = true;
}
public boolean isSingleton() {
return singleton;
}
public void setSingleton(boolean singleton) {
this.singleton = singleton;
}
public T getInstance() {
T instance;
if (isSingleton()) { // true
if (this.singletonInstance == null) { // 调用createInstance方法
this.singletonInstance = createInstance();
}
instance = this.singletonInstance;
} else {
instance = createInstance();
}
if (instance == null) {
String msg = "Factory 'createInstance' implementation returned a null object.";
throw new IllegalStateException(msg);
}
return instance;
}
// 方法为抽象方法,因此会调用子类(IniFactorySupport)的实现
protected abstract T createInstance();
}
调用子类(IniFactorySupport)的createInstance()
package org.apache.shiro.config;
public abstract class IniFactorySupport extends AbstractFactory {
/**
* Creates a new object instance by using a configured INI source.
* 1、获取ini指定的配置文件(resolveIni会调用getIni,读取之前setIni时的值);
* 2、若ini为空通过createDefaultInstance()方法创建默认的实例(default instance);否则基于ini创建实例(createInstance(ini))
*/
public T createInstance() {
Ini ini = resolveIni();
T instance;
if (CollectionUtils.isEmpty(ini)) {
log.debug("No populated Ini available. Creating a default instance.");
instance = createDefaultInstance();
if (instance == null) {
// 异常信息略
throw new IllegalStateException(msg);
}
} else {
log.debug("Creating instance from Ini [" + ini + "]");
instance = createInstance(ini);
if (instance == null) {
// 异常信息略
throw new IllegalStateException(msg);
}
}
return instance;
}
// 为抽象方法,需要调用其实现类的createInstance(Ini ini)方法
protected abstract T createInstance(Ini ini);
// 为抽象方法,需要调用其实现类的createDefaultInstance()方法
protected abstract T createDefaultInstance();
}
public class IniSecurityManagerFactory extends IniFactorySupport {
protected SecurityManager createDefaultInstance() {
return new DefaultSecurityManager();
}
}