org.springframework.aop.framework.autoproxy

## 类 AbstractAutoProxyCreator

- java.lang.Object
- - org.springframework.aop.framework.ProxyConfig
  - - org.springframework.aop.framework.ProxyProcessorSupport
    - - org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator

- 所有已实现的接口:
    Serializable, AopInfrastructureBean, org.springframework.beans.factory.Aware, org.springframework.beans.factory.BeanClassLoaderAware, org.springframework.beans.factory.BeanFactoryAware, org.springframework.beans.factory.config.BeanPostProcessor, org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor, org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor, org.springframework.core.Ordered
  直接已知子类:
    AbstractAdvisorAutoProxyCreator, BeanNameAutoProxyCreator

      public abstract class AbstractAutoProxyCreator
      extends ProxyProcessorSupport
      implements org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor, org.springframework.beans.factory.BeanFactoryAware

  `BeanPostProcessor` implementation that wraps each eligible bean with an AOP proxy, delegating to specified interceptors before invoking the bean itself.

  This class distinguishes between "common" interceptors: shared for all proxies it creates, and "specific" interceptors: unique per bean instance. There need not be any common interceptors. If there are, they are set using the interceptorNames property. As with `ProxyFactoryBean`, interceptors names in the current factory are used rather than bean references to allow correct handling of prototype advisors and interceptors: for example, to support stateful mixins. Any advice type is supported for `"interceptorNames"` entries.

  Such auto-proxying is particularly useful if there's a large number of beans that need to be wrapped with similar proxies, i.e. delegating to the same interceptors. Instead of x repetitive proxy definitions for x target beans, you can register one single such post processor with the bean factory to achieve the same effect.

  Subclasses can apply any strategy to decide if a bean is to be proxied, e.g. by type, by name, by definition details, etc. They can also return additional interceptors that should just be applied to the specific bean instance. A simple concrete implementation is `BeanNameAutoProxyCreator`, identifying the beans to be proxied via given names.

  Any number of `TargetSourceCreator` implementations can be used to create a custom target source: for example, to pool prototype objects. Auto-proxying will occur even if there is no advice, as long as a TargetSourceCreator specifies a custom `TargetSource`. If there are no TargetSourceCreators set, or if none matches, a `SingletonTargetSource` will be used by default to wrap the target bean instance.

  从以下版本开始:
    13.10.2003
  作者:
    Juergen Hoeller, Rod Johnson, Rob Harrop
  另请参阅:
    `setInterceptorNames(java.lang.String...)`, `getAdvicesAndAdvisorsForBean(java.lang.Class<?>, java.lang.String, org.springframework.aop.TargetSource)`, `BeanNameAutoProxyCreator`, `DefaultAdvisorAutoProxyCreator`, 序列化表格

- - ### 字段概要

    字段
    限定符和类型 | 字段和说明
    --- | ---
    `protected static Object[]` | `DO_NOT_PROXY` Convenience constant for subclasses: Return value for "do not proxy".
    `protected Log` | `logger` Logger available to subclasses
    `protected static Object[]` | `PROXY_WITHOUT_ADDITIONAL_INTERCEPTORS` Convenience constant for subclasses: Return value for "proxy without additional interceptors, just the common ones".

    - ### 从接口继承的字段 org.springframework.core.Ordered

      `HIGHEST_PRECEDENCE, LOWEST_PRECEDENCE`

  - ### 构造器概要

    构造器
    构造器和说明
    `AbstractAutoProxyCreator()`

  - ### 方法概要

    所有方法 实例方法 抽象方法 具体方法
    限定符和类型 | 方法和说明
    --- | ---
    `protected boolean` | `advisorsPreFiltered()` Return whether the Advisors returned by the subclass are pre-filtered to match the bean's target class already, allowing the ClassFilter check to be skipped when building advisors chains for AOP invocations.
    `protected Advisor[]` | `buildAdvisors(String beanName, Object[] specificInterceptors)` Determine the advisors for the given bean, including the specific interceptors as well as the common interceptor, all adapted to the Advisor interface.
    `protected Object` | `createProxy(Class<?> beanClass, String beanName, Object[] specificInterceptors, TargetSource targetSource)` Create an AOP proxy for the given bean.
    `protected void` | `customizeProxyFactory(ProxyFactory proxyFactory)` Subclasses may choose to implement this: for example, to change the interfaces exposed.
    `Constructor<?>[]` | `determineCandidateConstructors(Class<?> beanClass, String beanName)`
    `protected abstract Object[]` | `getAdvicesAndAdvisorsForBean(Class<?> beanClass, String beanName, TargetSource customTargetSource)` Return whether the given bean is to be proxied, what additional advices (e.g.
    `protected org.springframework.beans.factory.BeanFactory` | `getBeanFactory()` Return the owning `BeanFactory`.
    `protected Object` | `getCacheKey(Class<?> beanClass, String beanName)` Build a cache key for the given bean class and bean name.
    `protected TargetSource` | `getCustomTargetSource(Class<?> beanClass, String beanName)` Create a target source for bean instances.
    `Object` | `getEarlyBeanReference(Object bean, String beanName)`
    `boolean` | `isFrozen()` Return whether the config is frozen, and no advice changes can be made.
    `protected boolean` | `isInfrastructureClass(Class<?> beanClass)` Return whether the given bean class represents an infrastructure class that should never be proxied.
    `Object` | `postProcessAfterInitialization(Object bean, String beanName)` 在该后置方法中 我们的事务和aop的代理对象都是在这生成的
    `boolean` | `postProcessAfterInstantiation(Object bean, String beanName)`
    `Object` | `postProcessBeforeInitialization(Object bean, String beanName)`
    `Object` | `postProcessBeforeInstantiation(Class<?> beanClass, String beanName)` 在我们的创建Bean的流程中还没调用构造器来实例化bean的时候进行调用(实例化前后) 我们的aop 解析切面 以及事务解析事务注解都是在这里完成的
    `org.springframework.beans.PropertyValues` | `postProcessPropertyValues(org.springframework.beans.PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)`
    `Class<?>` | `predictBeanType(Class<?> beanClass, String beanName)`
    `void` | `setAdvisorAdapterRegistry(AdvisorAdapterRegistry advisorAdapterRegistry)` Specify the `AdvisorAdapterRegistry` to use.
    `void` | `setApplyCommonInterceptorsFirst(boolean applyCommonInterceptorsFirst)` Set whether the common interceptors should be applied before bean-specific ones.
    `void` | `setBeanFactory(org.springframework.beans.factory.BeanFactory beanFactory)`
    `void` | `setCustomTargetSourceCreators(TargetSourceCreator... targetSourceCreators)` Set custom `TargetSourceCreators` to be applied in this order.
    `void` | `setFrozen(boolean frozen)` Set whether or not the proxy should be frozen, preventing advice from being added to it once it is created.
    `void` | `setInterceptorNames(String... interceptorNames)` Set the common interceptors.
    `protected boolean` | `shouldProxyTargetClass(Class<?> beanClass, String beanName)` Determine whether the given bean should be proxied with its target class rather than its interfaces.
    `protected boolean` | `shouldSkip(Class<?> beanClass, String beanName)` Subclasses should override this method to return `true` if the given bean should not be considered for auto-proxying by this post-processor.
    `protected Object` | `wrapIfNecessary(Object bean, String beanName, Object cacheKey)` Wrap the given bean if necessary, i.e. if it is eligible for being proxied.

    - ### 从类继承的方法 org.springframework.aop.framework.ProxyProcessorSupport

      `evaluateProxyInterfaces, getOrder, getProxyClassLoader, isConfigurationCallbackInterface, isInternalLanguageInterface, setBeanClassLoader, setOrder, setProxyClassLoader`

    - ### 从类继承的方法 org.springframework.aop.framework.ProxyConfig

      `copyFrom, isExposeProxy, isOpaque, isOptimize, isProxyTargetClass, setExposeProxy, setOpaque, setOptimize, setProxyTargetClass, toString`

    - ### 从类继承的方法 java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`

- - ### 字段详细资料

    - #### DO_NOT_PROXY

          @Nullable
          protected static final Object[] DO_NOT_PROXY

      Convenience constant for subclasses: Return value for "do not proxy".
      另请参阅:
        `getAdvicesAndAdvisorsForBean(java.lang.Class<?>, java.lang.String, org.springframework.aop.TargetSource)`

    - #### PROXY_WITHOUT_ADDITIONAL_INTERCEPTORS

          protected static final Object[] PROXY_WITHOUT_ADDITIONAL_INTERCEPTORS

      Convenience constant for subclasses: Return value for "proxy without additional interceptors, just the common ones".
      另请参阅:
        `getAdvicesAndAdvisorsForBean(java.lang.Class<?>, java.lang.String, org.springframework.aop.TargetSource)`

    - #### logger

          protected final Log logger

      Logger available to subclasses

  - ### 构造器详细资料

    - #### AbstractAutoProxyCreator

          public AbstractAutoProxyCreator()

  - ### 方法详细资料

    - #### setFrozen

          public void setFrozen(boolean frozen)

      Set whether or not the proxy should be frozen, preventing advice from being added to it once it is created.

      Overridden from the super class to prevent the proxy configuration from being frozen before the proxy is created.

      覆盖:
        `setFrozen` 在类中 `ProxyConfig`

    - #### isFrozen

          public boolean isFrozen()

      从类复制的说明: `ProxyConfig`
      Return whether the config is frozen, and no advice changes can be made.
      覆盖:
        `isFrozen` 在类中 `ProxyConfig`

    - #### setAdvisorAdapterRegistry

          public void setAdvisorAdapterRegistry(AdvisorAdapterRegistry advisorAdapterRegistry)

      Specify the `AdvisorAdapterRegistry` to use.

      Default is the global `AdvisorAdapterRegistry`.

      另请参阅:
        `GlobalAdvisorAdapterRegistry`

    - #### setCustomTargetSourceCreators

          public void setCustomTargetSourceCreators(TargetSourceCreator... targetSourceCreators)

      Set custom `TargetSourceCreators` to be applied in this order. If the list is empty, or they all return null, a `SingletonTargetSource` will be created for each bean.

      Note that TargetSourceCreators will kick in even for target beans where no advices or advisors have been found. If a `TargetSourceCreator` returns a `TargetSource` for a specific bean, that bean will be proxied in any case.

      `TargetSourceCreators` can only be invoked if this post processor is used in a `BeanFactory` and its `BeanFactoryAware` callback is triggered.

      参数:
        `targetSourceCreators` - the list of `TargetSourceCreators`. Ordering is significant: The `TargetSource` returned from the first matching `TargetSourceCreator` (that is, the first that returns non-null) will be used.

    - #### setInterceptorNames

          public void setInterceptorNames(String... interceptorNames)

      Set the common interceptors. These must be bean names in the current factory. They can be of any advice or advisor type Spring supports.

      If this property isn't set, there will be zero common interceptors. This is perfectly valid, if "specific" interceptors such as matching Advisors are all we want.

    - #### setApplyCommonInterceptorsFirst

          public void setApplyCommonInterceptorsFirst(boolean applyCommonInterceptorsFirst)

      Set whether the common interceptors should be applied before bean-specific ones. Default is "true"; else, bean-specific interceptors will get applied first.

    - #### setBeanFactory

          public void setBeanFactory(org.springframework.beans.factory.BeanFactory beanFactory)

      指定者:
        `setBeanFactory` 在接口中 `org.springframework.beans.factory.BeanFactoryAware`

    - #### getBeanFactory

          @Nullable
          protected org.springframework.beans.factory.BeanFactory getBeanFactory()

      Return the owning `BeanFactory`. May be `null`, as this post-processor doesn't need to belong to a bean factory.

    - #### predictBeanType

          @Nullable
          public Class<?> predictBeanType(Class<?> beanClass,
                                                     String beanName)

      指定者:
        `predictBeanType` 在接口中 `org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor`

    - #### determineCandidateConstructors

          @Nullable
          public Constructor<?>[] determineCandidateConstructors(Class<?> beanClass,
                                                                            String beanName)
                                                                     throws org.springframework.beans.BeansException

      指定者:
        `determineCandidateConstructors` 在接口中 `org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor`
      抛出:
        `org.springframework.beans.BeansException`

    - #### getEarlyBeanReference

          public Object getEarlyBeanReference(Object bean,
                                              String beanName)
                                       throws org.springframework.beans.BeansException

      指定者:
        `getEarlyBeanReference` 在接口中 `org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor`
      抛出:
        `org.springframework.beans.BeansException`

    - #### postProcessBeforeInstantiation

          public Object postProcessBeforeInstantiation(Class<?> beanClass,
                                                       String beanName)
                                                throws org.springframework.beans.BeansException

      在我们的创建Bean的流程中还没调用构造器来实例化bean的时候进行调用(实例化前后) 我们的aop 解析切面 以及事务解析事务注解都是在这里完成的
      指定者:
        `postProcessBeforeInstantiation` 在接口中 `org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor`
      参数:
        `beanClass` - 当前正在创建的bean的class对象
        `beanName` - beanName
      返回:
      抛出:
        `org.springframework.beans.BeansException`

    - #### postProcessAfterInstantiation

          public boolean postProcessAfterInstantiation(Object bean,
                                                       String beanName)

      指定者:
        `postProcessAfterInstantiation` 在接口中 `org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor`

    - #### postProcessPropertyValues

          public org.springframework.beans.PropertyValues postProcessPropertyValues(org.springframework.beans.PropertyValues pvs,
                                                                                    PropertyDescriptor[] pds,
                                                                                    Object bean,
                                                                                    String beanName)

      指定者:
        `postProcessPropertyValues` 在接口中 `org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor`

    - #### postProcessBeforeInitialization

          public Object postProcessBeforeInitialization(Object bean,
                                                        String beanName)

      指定者:
        `postProcessBeforeInitialization` 在接口中 `org.springframework.beans.factory.config.BeanPostProcessor`

    - #### postProcessAfterInitialization

          public Object postProcessAfterInitialization(@Nullable
                                                       Object bean,
                                                       String beanName)
                                                throws org.springframework.beans.BeansException

      在该后置方法中 我们的事务和aop的代理对象都是在这生成的
      指定者:
        `postProcessAfterInitialization` 在接口中 `org.springframework.beans.factory.config.BeanPostProcessor`
      参数:
        `bean` - bean实例
        `beanName` - bean的名称
      返回:
      抛出:
        `org.springframework.beans.BeansException`

    - #### getCacheKey

          protected Object getCacheKey(Class<?> beanClass,
                                       @Nullable
                                       String beanName)

      Build a cache key for the given bean class and bean name.

      Note: As of 4.2.3, this implementation does not return a concatenated class/name String anymore but rather the most efficient cache key possible: a plain bean name, prepended with `BeanFactory.FACTORY_BEAN_PREFIX` in case of a `FactoryBean`; or if no bean name specified, then the given bean `Class` as-is.

      参数:
        `beanClass` - the bean class
        `beanName` - the bean name
      返回:
        the cache key for the given class and name

    - #### wrapIfNecessary

          protected Object wrapIfNecessary(Object bean,
                                           String beanName,
                                           Object cacheKey)

      Wrap the given bean if necessary, i.e. if it is eligible for being proxied.
      参数:
        `bean` - the raw bean instance
        `beanName` - the name of the bean
        `cacheKey` - the cache key for metadata access
      返回:
        a proxy wrapping the bean, or the raw bean instance as-is

    - #### isInfrastructureClass

          protected boolean isInfrastructureClass(Class<?> beanClass)

      Return whether the given bean class represents an infrastructure class that should never be proxied.

      The default implementation considers Advices, Advisors and AopInfrastructureBeans as infrastructure classes.

      参数:
        `beanClass` - the class of the bean
      返回:
        whether the bean represents an infrastructure class
      另请参阅:
        `Advice`, `Advisor`, `AopInfrastructureBean`, `shouldSkip(java.lang.Class<?>, java.lang.String)`

    - #### shouldSkip

          protected boolean shouldSkip(Class<?> beanClass,
                                       String beanName)

      Subclasses should override this method to return `true` if the given bean should not be considered for auto-proxying by this post-processor.

      Sometimes we need to be able to avoid this happening if it will lead to a circular reference. This implementation returns `false`.

      参数:
        `beanClass` - the class of the bean
        `beanName` - the name of the bean
      返回:
        whether to skip the given bean

    - #### getCustomTargetSource

          @Nullable
          protected TargetSource getCustomTargetSource(Class<?> beanClass,
                                                                  String beanName)

      Create a target source for bean instances. Uses any TargetSourceCreators if set. Returns `null` if no custom TargetSource should be used.

      This implementation uses the "customTargetSourceCreators" property. Subclasses can override this method to use a different mechanism.

      参数:
        `beanClass` - the class of the bean to create a TargetSource for
        `beanName` - the name of the bean
      返回:
        a TargetSource for this bean
      另请参阅:
        `setCustomTargetSourceCreators(org.springframework.aop.framework.autoproxy.TargetSourceCreator...)`

    - #### createProxy

          protected Object createProxy(Class<?> beanClass,
                                       @Nullable
                                       String beanName,
                                       @Nullable
                                       Object[] specificInterceptors,
                                       TargetSource targetSource)

      Create an AOP proxy for the given bean.
      参数:
        `beanClass` - the class of the bean
        `beanName` - the name of the bean
        `specificInterceptors` - the set of interceptors that is specific to this bean (may be empty, but not null)
        `targetSource` - the TargetSource for the proxy, already pre-configured to access the bean
      返回:
        the AOP proxy for the bean
      另请参阅:
        `buildAdvisors(java.lang.String, java.lang.Object[])`

    - #### shouldProxyTargetClass

          protected boolean shouldProxyTargetClass(Class<?> beanClass,
                                                   @Nullable
                                                   String beanName)

      Determine whether the given bean should be proxied with its target class rather than its interfaces.

      Checks the `"preserveTargetClass" attribute` of the corresponding bean definition.

      参数:
        `beanClass` - the class of the bean
        `beanName` - the name of the bean
      返回:
        whether the given bean should be proxied with its target class
      另请参阅:
        `AutoProxyUtils.shouldProxyTargetClass(org.springframework.beans.factory.config.ConfigurableListableBeanFactory, java.lang.String)`

    - #### advisorsPreFiltered

          protected boolean advisorsPreFiltered()

      Return whether the Advisors returned by the subclass are pre-filtered to match the bean's target class already, allowing the ClassFilter check to be skipped when building advisors chains for AOP invocations.

      Default is `false`. Subclasses may override this if they will always return pre-filtered Advisors.

      返回:
        whether the Advisors are pre-filtered
      另请参阅:
        `getAdvicesAndAdvisorsForBean(java.lang.Class<?>, java.lang.String, org.springframework.aop.TargetSource)`, `Advised.setPreFiltered(boolean)`

    - #### buildAdvisors

          protected Advisor[] buildAdvisors(@Nullable
                                            String beanName,
                                            @Nullable
                                            Object[] specificInterceptors)

      Determine the advisors for the given bean, including the specific interceptors as well as the common interceptor, all adapted to the Advisor interface.
      参数:
        `beanName` - the name of the bean
        `specificInterceptors` - the set of interceptors that is specific to this bean (may be empty, but not null)
      返回:
        the list of Advisors for the given bean

    - #### customizeProxyFactory

          protected void customizeProxyFactory(ProxyFactory proxyFactory)

      Subclasses may choose to implement this: for example, to change the interfaces exposed.

      The default implementation is empty.

      参数:
        `proxyFactory` - a ProxyFactory that is already configured with TargetSource and interfaces and will be used to create the proxy immediately after this method returns

    - #### getAdvicesAndAdvisorsForBean

          @Nullable
          protected abstract Object[] getAdvicesAndAdvisorsForBean(Class<?> beanClass,
                                                                              String beanName,
                                                                              @Nullable
                                                                              TargetSource customTargetSource)
                                                                       throws org.springframework.beans.BeansException

      Return whether the given bean is to be proxied, what additional advices (e.g. AOP Alliance interceptors) and advisors to apply.
      参数:
        `beanClass` - the class of the bean to advise
        `beanName` - the name of the bean
        `customTargetSource` - the TargetSource returned by the `getCustomTargetSource(java.lang.Class<?>, java.lang.String)` method: may be ignored. Will be `null` if no custom target source is in use.
      返回:
        an array of additional interceptors for the particular bean; or an empty array if no additional interceptors but just the common ones; or `null` if no proxy at all, not even with the common interceptors. See constants DO_NOT_PROXY and PROXY_WITHOUT_ADDITIONAL_INTERCEPTORS.
      抛出:
        `org.springframework.beans.BeansException` - in case of errors
      另请参阅:
        `DO_NOT_PROXY`, `PROXY_WITHOUT_ADDITIONAL_INTERCEPTORS`