Mybatis VFS涉及到的单例模式
静态内部类方式单例模式示例
package com.wjz.mybatis.singleton; import com.wjz.mybatis.pojo.Person; /** * 静态内部类方式单例模式 * * @author iss002 * */ public abstract class StaticInnerTest { // 私有的静态内部类,只会在newInstance方法中被使用 private static class PersonHondler { // 访问静态内部类的静态字段时静态内部类才会被初始化 // 类加载机制保证类只加载一次即保证线程安全 public static final Person person = new Person(); } public static Person newInstance() { return PersonHondler.person; } }
VFS涉及的单例模式
public abstract class VFS { public static VFS getInstance() { return VFSHolder.INSTANCE; } private static class VFSHolder { static final VFS INSTANCE = createVFS(); /** Singleton instance holder. */ @SuppressWarnings("unchecked") static VFS createVFS() { // Try the user implementations first, then the built-ins List<Class<? extends VFS>> impls = new ArrayList<Class<? extends VFS>>(); impls.addAll(USER_IMPLEMENTATIONS); impls.addAll(Arrays.asList((Class<? extends VFS>[]) IMPLEMENTATIONS)); // Try each implementation class until a valid one is found VFS vfs = null; for (int i = 0; vfs == null || !vfs.isValid(); i++) { Class<? extends VFS> impl = impls.get(i); try { vfs = impl.newInstance(); if (vfs == null || !vfs.isValid()) { if (log.isDebugEnabled()) { log.debug("VFS implementation " + impl.getName() + " is not valid in this environment."); } } } catch (InstantiationException e) { log.error("Failed to instantiate " + impl, e); return null; } catch (IllegalAccessException e) { log.error("Failed to instantiate " + impl, e); return null; } } if (log.isDebugEnabled()) { log.debug("Using VFS adapter " + vfs.getClass().getName()); } return vfs; } } }