diff --git a/docs/LearningExperience/DesignPattern/从Spring及Mybatis框架源码中学习设计模式(行为型).md b/docs/LearningExperience/DesignPattern/从Spring及Mybatis框架源码中学习设计模式(行为型).md index fe6b324..3979bec 100644 --- a/docs/LearningExperience/DesignPattern/从Spring及Mybatis框架源码中学习设计模式(行为型).md +++ b/docs/LearningExperience/DesignPattern/从Spring及Mybatis框架源码中学习设计模式(行为型).md @@ -26,184 +26,184 @@ Spring的 AbstractAutowireCapableBeanFactory 在进行bean实例化时使用了 */ public interface InstantiationStrategy { - /** - * 返回一个bean实例,使用BeanFactory给定的参数 - */ - Object instantiate(RootBeanDefinition beanDefinition, String beanName, BeanFactory owner) - throws BeansException; - - Object instantiate(RootBeanDefinition beanDefinition, String beanName, BeanFactory owner, - Constructor ctor, Object[] args) throws BeansException; - - Object instantiate(RootBeanDefinition beanDefinition, String beanName, BeanFactory owner, - Object factoryBean, Method factoryMethod, Object[] args) throws BeansException; + /** + * 返回一个bean实例,使用BeanFactory给定的参数 + */ + Object instantiate(RootBeanDefinition beanDefinition, String beanName, BeanFactory owner) + throws BeansException; + + Object instantiate(RootBeanDefinition beanDefinition, String beanName, BeanFactory owner, + Constructor ctor, Object[] args) throws BeansException; + + Object instantiate(RootBeanDefinition beanDefinition, String beanName, BeanFactory owner, + Object factoryBean, Method factoryMethod, Object[] args) throws BeansException; } public class SimpleInstantiationStrategy implements InstantiationStrategy { - /** - * 具体使用哪个策略进行bean的实例化,是在这个实现类中决定的 - */ - public Object instantiate(RootBeanDefinition beanDefinition, String beanName, BeanFactory owner) { - // 如果beanDefinition中没有方法覆盖,则使用Java的反射机制实例化对象,否则使用CGLIB策略 - if (beanDefinition.getMethodOverrides().isEmpty()) { - Constructor constructorToUse; - synchronized (beanDefinition.constructorArgumentLock) { - // 获取对象的构造方法或生成对象的工厂方法对bean进行实例化 - constructorToUse = (Constructor) beanDefinition.resolvedConstructorOrFactoryMethod; - - // 如果前面没有获取到构造方法,则通过反射获取 - if (constructorToUse == null) { - // 使用JDK的反射机制,判断要实例化的Bean是否是接口 - final Class clazz = beanDefinition.getBeanClass(); - // 如果clazz是一个接口,直接抛出异常 - if (clazz.isInterface()) { - throw new BeanInstantiationException(clazz, "Specified class is an interface"); - } - try { - if (System.getSecurityManager() != null) { - // 这里是一个匿名内置类,使用反射机制获取Bean的构造方法 - constructorToUse = AccessController.doPrivileged(new PrivilegedExceptionAction() { - public Constructor run() throws Exception { - return clazz.getDeclaredConstructor((Class[]) null); - } - }); - } - else { - constructorToUse = clazz.getDeclaredConstructor((Class[]) null); - } - beanDefinition.resolvedConstructorOrFactoryMethod = constructorToUse; - } - catch (Exception ex) { - throw new BeanInstantiationException(clazz, "No default constructor found", ex); - } - } - } - // 使用BeanUtils实例化,通过反射机制调用”构造方法.newInstance(arg)”来进行实例化 - return BeanUtils.instantiateClass(constructorToUse); - } - else { - /** - * !!!!!!!!!!!!!! - * 使用CGLIB来实例化对象 - * 调用了其子类CglibSubclassingInstantiationStrategy中的实现 - * !!!!!!!!!!!!!! - */ - return instantiateWithMethodInjection(beanDefinition, beanName, owner); - } - } + /** + * 具体使用哪个策略进行bean的实例化,是在这个实现类中决定的 + */ + public Object instantiate(RootBeanDefinition beanDefinition, String beanName, BeanFactory owner) { + // 如果beanDefinition中没有方法覆盖,则使用Java的反射机制实例化对象,否则使用CGLIB策略 + if (beanDefinition.getMethodOverrides().isEmpty()) { + Constructor constructorToUse; + synchronized (beanDefinition.constructorArgumentLock) { + // 获取对象的构造方法或生成对象的工厂方法对bean进行实例化 + constructorToUse = (Constructor) beanDefinition.resolvedConstructorOrFactoryMethod; + + // 如果前面没有获取到构造方法,则通过反射获取 + if (constructorToUse == null) { + // 使用JDK的反射机制,判断要实例化的Bean是否是接口 + final Class clazz = beanDefinition.getBeanClass(); + // 如果clazz是一个接口,直接抛出异常 + if (clazz.isInterface()) { + throw new BeanInstantiationException(clazz, "Specified class is an interface"); + } + try { + if (System.getSecurityManager() != null) { + // 这里是一个匿名内置类,使用反射机制获取Bean的构造方法 + constructorToUse = AccessController.doPrivileged(new PrivilegedExceptionAction() { + public Constructor run() throws Exception { + return clazz.getDeclaredConstructor((Class[]) null); + } + }); + } + else { + constructorToUse = clazz.getDeclaredConstructor((Class[]) null); + } + beanDefinition.resolvedConstructorOrFactoryMethod = constructorToUse; + } + catch (Exception ex) { + throw new BeanInstantiationException(clazz, "No default constructor found", ex); + } + } + } + // 使用BeanUtils实例化,通过反射机制调用”构造方法.newInstance(arg)”来进行实例化 + return BeanUtils.instantiateClass(constructorToUse); + } + else { + /** + * !!!!!!!!!!!!!! + * 使用CGLIB来实例化对象 + * 调用了其子类CglibSubclassingInstantiationStrategy中的实现 + * !!!!!!!!!!!!!! + */ + return instantiateWithMethodInjection(beanDefinition, beanName, owner); + } + } } public class CglibSubclassingInstantiationStrategy extends SimpleInstantiationStrategy { - /** - * 下面两个方法都通过实例化自己的私有静态内部类CglibSubclassCreator, - * 然后调用该内部类对象的实例化方法instantiate()完成实例化 - */ - protected Object instantiateWithMethodInjection( - RootBeanDefinition beanDefinition, String beanName, BeanFactory owner) { - - // 必须生成cglib子类 - return new CglibSubclassCreator(beanDefinition, owner).instantiate(null, null); - } - - @Override - protected Object instantiateWithMethodInjection( - RootBeanDefinition beanDefinition, String beanName, BeanFactory owner, - Constructor ctor, Object[] args) { - - return new CglibSubclassCreator(beanDefinition, owner).instantiate(ctor, args); - } - - /** - * 为避免3.2之前的Spring版本中的外部cglib依赖而创建的内部类 - */ - private static class CglibSubclassCreator { - - private final RootBeanDefinition beanDefinition; - - private final BeanFactory owner; - - public CglibSubclassCreator(RootBeanDefinition beanDefinition, BeanFactory owner) { - this.beanDefinition = beanDefinition; - this.owner = owner; - } - - //使用CGLIB进行Bean对象实例化 - public Object instantiate(Constructor ctor, Object[] args) { - //实例化Enhancer对象,并为Enhancer对象设置父类,生成Java对象的参数,比如:基类、回调方法等 - Enhancer enhancer = new Enhancer(); - //将Bean本身作为其父类 - enhancer.setSuperclass(this.beanDefinition.getBeanClass()); - enhancer.setCallbackFilter(new CallbackFilterImpl()); - enhancer.setCallbacks(new Callback[] { - NoOp.INSTANCE, - new LookupOverrideMethodInterceptor(), - new ReplaceOverrideMethodInterceptor() - }); - - //使用CGLIB的create方法生成实例对象 - return (ctor == null) ? enhancer.create() : enhancer.create(ctor.getParameterTypes(), args); - } - } + /** + * 下面两个方法都通过实例化自己的私有静态内部类CglibSubclassCreator, + * 然后调用该内部类对象的实例化方法instantiate()完成实例化 + */ + protected Object instantiateWithMethodInjection( + RootBeanDefinition beanDefinition, String beanName, BeanFactory owner) { + + // 必须生成cglib子类 + return new CglibSubclassCreator(beanDefinition, owner).instantiate(null, null); + } + + @Override + protected Object instantiateWithMethodInjection( + RootBeanDefinition beanDefinition, String beanName, BeanFactory owner, + Constructor ctor, Object[] args) { + + return new CglibSubclassCreator(beanDefinition, owner).instantiate(ctor, args); + } + + /** + * 为避免3.2之前的Spring版本中的外部cglib依赖而创建的内部类 + */ + private static class CglibSubclassCreator { + + private final RootBeanDefinition beanDefinition; + + private final BeanFactory owner; + + public CglibSubclassCreator(RootBeanDefinition beanDefinition, BeanFactory owner) { + this.beanDefinition = beanDefinition; + this.owner = owner; + } + + //使用CGLIB进行Bean对象实例化 + public Object instantiate(Constructor ctor, Object[] args) { + //实例化Enhancer对象,并为Enhancer对象设置父类,生成Java对象的参数,比如:基类、回调方法等 + Enhancer enhancer = new Enhancer(); + //将Bean本身作为其父类 + enhancer.setSuperclass(this.beanDefinition.getBeanClass()); + enhancer.setCallbackFilter(new CallbackFilterImpl()); + enhancer.setCallbacks(new Callback[] { + NoOp.INSTANCE, + new LookupOverrideMethodInterceptor(), + new ReplaceOverrideMethodInterceptor() + }); + + //使用CGLIB的create方法生成实例对象 + return (ctor == null) ? enhancer.create() : enhancer.create(ctor.getParameterTypes(), args); + } + } } public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory { - /** 创建bean实例的策略,注意 这里直接实例化的是 CglibSubclassingInstantiationStrategy 对象 */ - private InstantiationStrategy instantiationStrategy = new CglibSubclassingInstantiationStrategy(); - - /** - * 设置用于创建bean实例的实例化策略,默认使用CglibSubclassingInstantiationStrategy - */ - public void setInstantiationStrategy(InstantiationStrategy instantiationStrategy) { - this.instantiationStrategy = instantiationStrategy; - } - - protected InstantiationStrategy getInstantiationStrategy() { - return this.instantiationStrategy; - } - - /** - * 使用默认的无参构造方法实例化Bean对象 - */ - protected BeanWrapper instantiateBean(final String beanName, final RootBeanDefinition mbd) { - try { - Object beanInstance; - final BeanFactory parent = this; - // 获取系统的安全管理接口,JDK标准的安全管理API - if (System.getSecurityManager() != null) { - // 这里是一个匿名内置类,根据实例化策略创建实例对象 - beanInstance = AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - return getInstantiationStrategy().instantiate(mbd, beanName, parent); - } - }, getAccessControlContext()); - } - else { - - /** - * !!!!!!!!!!!!!! - * 使用初始化策略实例化Bean对象 - * !!!!!!!!!!!!!! - */ - beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent); - } - BeanWrapper bw = new BeanWrapperImpl(beanInstance); - initBeanWrapper(bw); - return bw; - } - catch (Throwable ex) { - throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Instantiation of bean failed", ex); - } - } - - ... + /** 创建bean实例的策略,注意 这里直接实例化的是 CglibSubclassingInstantiationStrategy 对象 */ + private InstantiationStrategy instantiationStrategy = new CglibSubclassingInstantiationStrategy(); + + /** + * 设置用于创建bean实例的实例化策略,默认使用CglibSubclassingInstantiationStrategy + */ + public void setInstantiationStrategy(InstantiationStrategy instantiationStrategy) { + this.instantiationStrategy = instantiationStrategy; + } + + protected InstantiationStrategy getInstantiationStrategy() { + return this.instantiationStrategy; + } + + /** + * 使用默认的无参构造方法实例化Bean对象 + */ + protected BeanWrapper instantiateBean(final String beanName, final RootBeanDefinition mbd) { + try { + Object beanInstance; + final BeanFactory parent = this; + // 获取系统的安全管理接口,JDK标准的安全管理API + if (System.getSecurityManager() != null) { + // 这里是一个匿名内置类,根据实例化策略创建实例对象 + beanInstance = AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + return getInstantiationStrategy().instantiate(mbd, beanName, parent); + } + }, getAccessControlContext()); + } + else { + + /** + * !!!!!!!!!!!!!! + * 使用初始化策略实例化Bean对象 + * !!!!!!!!!!!!!! + */ + beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent); + } + BeanWrapper bw = new BeanWrapperImpl(beanInstance); + initBeanWrapper(bw); + return bw; + } + catch (Throwable ex) { + throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Instantiation of bean failed", ex); + } + } + + ... } ``` @@ -423,87 +423,87 @@ Spring 中的 AbstractApplicationContext 和其子类 AbstractRefreshableApplica public abstract class AbstractApplicationContext extends DefaultResourceLoader implements ConfigurableApplicationContext, DisposableBean { - /** - * 告诉子类启动refreshBeanFactory()方法,BeanDefinition资源文件的载入 - * 从子类的refreshBeanFactory()方法启动开始 - */ - protected ConfigurableListableBeanFactory obtainFreshBeanFactory() { - // 这里使用了模板方法模式,自己定义了流程,个性化的方法实现交由子类完成 - // 其中,refreshBeanFactory() 和 getBeanFactory()为抽象方法 - refreshBeanFactory(); - ConfigurableListableBeanFactory beanFactory = getBeanFactory(); - if (logger.isDebugEnabled()) { - logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory); - } - return beanFactory; - } - - protected abstract void refreshBeanFactory() throws BeansException, IllegalStateException; - - public abstract ConfigurableListableBeanFactory getBeanFactory() throws IllegalStateException; + /** + * 告诉子类启动refreshBeanFactory()方法,BeanDefinition资源文件的载入 + * 从子类的refreshBeanFactory()方法启动开始 + */ + protected ConfigurableListableBeanFactory obtainFreshBeanFactory() { + // 这里使用了模板方法模式,自己定义了流程,个性化的方法实现交由子类完成 + // 其中,refreshBeanFactory() 和 getBeanFactory()为抽象方法 + refreshBeanFactory(); + ConfigurableListableBeanFactory beanFactory = getBeanFactory(); + if (logger.isDebugEnabled()) { + logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory); + } + return beanFactory; + } + + protected abstract void refreshBeanFactory() throws BeansException, IllegalStateException; + + public abstract ConfigurableListableBeanFactory getBeanFactory() throws IllegalStateException; } public abstract class AbstractRefreshableApplicationContext extends AbstractApplicationContext { - /** - * 在这里完成了容器的初始化,并赋值给自己private的beanFactory属性,为下一步调用做准备 - * 从父类AbstractApplicationContext继承的抽象方法,自己做了实现 - */ - @Override - protected final void refreshBeanFactory() throws BeansException { - // 如果已经建立了IoC容器,则销毁并关闭容器 - if (hasBeanFactory()) { - destroyBeans(); - closeBeanFactory(); - } - try { - // 创建IoC容器,DefaultListableBeanFactory类实现了ConfigurableListableBeanFactory接口 - DefaultListableBeanFactory beanFactory = createBeanFactory(); - beanFactory.setSerializationId(getId()); - // 定制化IoC容器,如设置启动参数,开启注解的自动装配等 - customizeBeanFactory(beanFactory); - // 载入BeanDefinition,这里又使用了一个委派模式,在当前类定义此抽象方法,子类容器具体实现 - loadBeanDefinitions(beanFactory); - synchronized (this.beanFactoryMonitor) { - // 给自己的属性赋值 - this.beanFactory = beanFactory; - } - } - catch (IOException ex) { - throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex); - } - } - - @Override - public final ConfigurableListableBeanFactory getBeanFactory() { - synchronized (this.beanFactoryMonitor) { - if (this.beanFactory == null) { - throw new IllegalStateException("BeanFactory not initialized or already closed - " + - "call 'refresh' before accessing beans via the ApplicationContext"); - } - return this.beanFactory; - } - } + /** + * 在这里完成了容器的初始化,并赋值给自己private的beanFactory属性,为下一步调用做准备 + * 从父类AbstractApplicationContext继承的抽象方法,自己做了实现 + */ + @Override + protected final void refreshBeanFactory() throws BeansException { + // 如果已经建立了IoC容器,则销毁并关闭容器 + if (hasBeanFactory()) { + destroyBeans(); + closeBeanFactory(); + } + try { + // 创建IoC容器,DefaultListableBeanFactory类实现了ConfigurableListableBeanFactory接口 + DefaultListableBeanFactory beanFactory = createBeanFactory(); + beanFactory.setSerializationId(getId()); + // 定制化IoC容器,如设置启动参数,开启注解的自动装配等 + customizeBeanFactory(beanFactory); + // 载入BeanDefinition,这里又使用了一个委派模式,在当前类定义此抽象方法,子类容器具体实现 + loadBeanDefinitions(beanFactory); + synchronized (this.beanFactoryMonitor) { + // 给自己的属性赋值 + this.beanFactory = beanFactory; + } + } + catch (IOException ex) { + throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex); + } + } + + @Override + public final ConfigurableListableBeanFactory getBeanFactory() { + synchronized (this.beanFactoryMonitor) { + if (this.beanFactory == null) { + throw new IllegalStateException("BeanFactory not initialized or already closed - " + + "call 'refresh' before accessing beans via the ApplicationContext"); + } + return this.beanFactory; + } + } } public class GenericApplicationContext extends AbstractApplicationContext implements BeanDefinitionRegistry { - @Override - protected final void refreshBeanFactory() throws IllegalStateException { - if (this.refreshed) { - throw new IllegalStateException( - "GenericApplicationContext does not support multiple refresh attempts: just call 'refresh' once"); - } - this.beanFactory.setSerializationId(getId()); - this.refreshed = true; - } - - public final ConfigurableListableBeanFactory getBeanFactory() { - return this.beanFactory; - } + @Override + protected final void refreshBeanFactory() throws IllegalStateException { + if (this.refreshed) { + throw new IllegalStateException( + "GenericApplicationContext does not support multiple refresh attempts: just call 'refresh' once"); + } + this.beanFactory.setSerializationId(getId()); + this.refreshed = true; + } + + public final ConfigurableListableBeanFactory getBeanFactory() { + return this.beanFactory; + } } ``` @@ -829,66 +829,66 @@ public class ReuseExecutor extends BaseExecutor { - Iterator:主要定义了hasNest() 和 next()方法; ```java public interface Aggregate { - Iterator iterator(); + Iterator iterator(); } public class ConcreteAggregate implements Aggregate { - private Integer[] elements; - - public ConcreteAggregate() { - elements = new Integer[10]; - for (int i = 0; i < elements.length; i++) { - elements[i] = i; - } - } - - @Override - public Iterator iterator() { - return new ConcreteIterator(elements); - } + private Integer[] elements; + + public ConcreteAggregate() { + elements = new Integer[10]; + for (int i = 0; i < elements.length; i++) { + elements[i] = i; + } + } + + @Override + public Iterator iterator() { + return new ConcreteIterator(elements); + } } public interface Iterator { - boolean hasNext(); - - Integer next(); + boolean hasNext(); + + Integer next(); } public class ConcreteIterator implements Iterator { - private Integer[] elements; - private int position = 0; - - public ConcreteIterator(Integer[] elements) { - this.elements = elements; - } - - @Override - public boolean hasNext() { - return position < elements.length; - } - - @Override - public Integer next() { - return elements[position ++]; - } + private Integer[] elements; + private int position = 0; + + public ConcreteIterator(Integer[] elements) { + this.elements = elements; + } + + @Override + public boolean hasNext() { + return position < elements.length; + } + + @Override + public Integer next() { + return elements[position ++]; + } } public class Client { - public static void main(String[] args) { - Aggregate aggregate = new ConcreteAggregate(); - Iterator iterator = aggregate.iterator(); - while (iterator.hasNext()) { - System.out.println(iterator.next()); - } - } + public static void main(String[] args) { + Aggregate aggregate = new ConcreteAggregate(); + Iterator iterator = aggregate.iterator(); + while (iterator.hasNext()) { + System.out.println(iterator.next()); + } + } } ```