Overview | Package | Class | Use | Tree | Deprecated | Index | Help
| The Spring Framework
PREV CLASS NEXT CLASS | FRAMES NO FRAMES
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD

## org.springframework.aop.framework.autoproxy
Class AbstractAutoProxyCreator

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

All Implemented Interfaces:
  Serializable, AopInfrastructureBean, BeanClassLoaderAware, BeanFactoryAware, BeanPostProcessor, InstantiationAwareBeanPostProcessor, Ordered

Direct Known Subclasses:
  AbstractAdvisorAutoProxyCreator, BeanNameAutoProxyCreator

    public abstract class AbstractAutoProxyCreator

extends ProxyConfig
implements InstantiationAwareBeanPostProcessor, BeanClassLoaderAware, BeanFactoryAware, Ordered, AopInfrastructureBean

`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. The default concrete implementation is BeanNameAutoProxyCreator, identifying the beans to be proxied via a list of bean 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.

Since:
  13.10.2003
Author:
  Juergen Hoeller, Rod Johnson, Rob Harrop
See Also:
  `setInterceptorNames(java.lang.String[])`, `getAdvicesAndAdvisorsForBean(java.lang.Class, java.lang.String, org.springframework.aop.TargetSource)`, `BeanNameAutoProxyCreator`, `DefaultAdvisorAutoProxyCreator`, Serialized Form

Field Summary
`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".

Fields inherited from interface org.springframework.core.Ordered
`HIGHEST_PRECEDENCE, LOWEST_PRECEDENCE`

Constructor Summary
`AbstractAutoProxyCreator()`

Method Summary
`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.
`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 BeanFactory` | `getBeanFactory()` Return the owning BeanFactory May be `null`, as this object doesn't need to belong to a bean factory.
`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.
`int` | `getOrder()` Return the order value of this object, with a higher value meaning greater in terms of sorting.
`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.
`protected boolean` | `isInfrastructureClass(Class beanClass, String beanName)` Deprecated. in favor of `isInfrastructureClass(beanClass)`
`Object` | `postProcessAfterInitialization(Object bean, String beanName)` Create a proxy with the configured interceptors if the bean is identified as one to proxy by the subclass.
`boolean` | `postProcessAfterInstantiation(Object bean, String beanName)` Perform operations after the bean has been instantiated, via a constructor or factory method, but before Spring property population (from explicit properties or autowiring) occurs.
`Object` | `postProcessBeforeInitialization(Object bean, String beanName)` Apply this BeanPostProcessor to the given new bean instance before any bean initialization callbacks (like InitializingBean's `afterPropertiesSet` or a custom init-method).
`Object` | `postProcessBeforeInstantiation(Class beanClass, String beanName)` Apply this BeanPostProcessor before the target bean gets instantiated.
`PropertyValues` | `postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)` Post-process the given property values before the factory applies them to the given bean.
`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` | `setBeanClassLoader(ClassLoader classLoader)` Callback that supplies the bean `class loader` to a bean instance.
`void` | `setBeanFactory(BeanFactory beanFactory)` Callback that supplies the owning factory to a bean instance.
`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.
`void` | `setOrder(int order)` Set the ordering which will apply to this class's implementation of Ordered, used when applying multiple BeanPostProcessors.
`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.

Methods inherited from class org.springframework.aop.framework.ProxyConfig
`copyFrom, isExposeProxy, isOpaque, isOptimize, isProxyTargetClass, setExposeProxy, setOpaque, setOptimize, setProxyTargetClass, toString`

Methods inherited from class java.lang.Object
`clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`

Field Detail

### DO_NOT_PROXY

    protected static final Object[] DO_NOT_PROXY

  Convenience constant for subclasses: Return value for "do not proxy".

  See Also:
    `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".

  See Also:
    `getAdvicesAndAdvisorsForBean(java.lang.Class, java.lang.String, org.springframework.aop.TargetSource)`

### logger

    protected final Log logger

  Logger available to subclasses

Constructor Detail

### AbstractAutoProxyCreator

    public AbstractAutoProxyCreator()

Method Detail

### setOrder

    public final void setOrder(int order)

  Set the ordering which will apply to this class's implementation of Ordered, used when applying multiple BeanPostProcessors.

  Default value is `Integer.MAX_VALUE`, meaning that it's non-ordered.

  Parameters:
    `order` - ordering value

### getOrder

    public final int getOrder()

  Description copied from interface: `Ordered`
  Return the order value of this object, with a higher value meaning greater in terms of sorting.

  Normally starting with 0 or 1, with `Ordered.LOWEST_PRECEDENCE` indicating greatest. Same order values will result in arbitrary positions for the affected objects.

  Higher value can be interpreted as lower priority, consequently the first object has highest priority (somewhat analogous to Servlet "load-on-startup" values).

  Note that order values below 0 are reserved for framework purposes. Application-specified values should always be 0 or greater, with only framework components (internal or third-party) supposed to use lower values.

  Specified by:
    `getOrder` in interface `Ordered`
  Returns:
    the order value
  See Also:
    `Ordered.LOWEST_PRECEDENCE`

### 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.

  Overrides:
    `setFrozen` in class `ProxyConfig`

### isFrozen

    public boolean isFrozen()

  Description copied from class: `ProxyConfig`
  Return whether the config is frozen, and no advice changes can be made.

  Overrides:
    `isFrozen` in class `ProxyConfig`

### setAdvisorAdapterRegistry

    public void setAdvisorAdapterRegistry(AdvisorAdapterRegistry advisorAdapterRegistry)

  Specify the AdvisorAdapterRegistry to use. Default is the global AdvisorAdapterRegistry.

  See Also:
    `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 used.

  Parameters:
    `targetSourceCreators` - list of TargetSourceCreator. 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.

### setBeanClassLoader

    public void setBeanClassLoader(ClassLoader classLoader)

  Description copied from interface: `BeanClassLoaderAware`
  Callback that supplies the bean `class loader` to a bean instance.

  Invoked after the population of normal bean properties but before an initialization callback such as `InitializingBean's` `InitializingBean.afterPropertiesSet()` method or a custom init-method.

  Specified by:
    `setBeanClassLoader` in interface `BeanClassLoaderAware`
  Parameters:
    `classLoader` - the owning class loader; may be `null` in which case a default `ClassLoader` must be used, for example the `ClassLoader` obtained via `ClassUtils.getDefaultClassLoader()`

### setBeanFactory

    public void setBeanFactory(BeanFactory beanFactory)

  Description copied from interface: `BeanFactoryAware`
  Callback that supplies the owning factory to a bean instance.

  Invoked after the population of normal bean properties but before an initialization callback such as `InitializingBean.afterPropertiesSet()` or a custom init-method.

  Specified by:
    `setBeanFactory` in interface `BeanFactoryAware`
  Parameters:
    `beanFactory` - owning BeanFactory (never `null`). The bean can immediately call methods on the factory.
  See Also:
    `BeanInitializationException`

### getBeanFactory

    protected BeanFactory getBeanFactory()

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

### postProcessBeforeInstantiation

    public Object postProcessBeforeInstantiation(Class beanClass,
                                                 String beanName)
                                          throws BeansException

  Description copied from interface: `InstantiationAwareBeanPostProcessor`
  Apply this BeanPostProcessor before the target bean gets instantiated. The returned bean object may be a proxy to use instead of the target bean, effectively suppressing default instantiation of the target bean.

  If a non-null object is returned by this method, the bean creation process will be short-circuited. The only further processing applied is the `BeanPostProcessor.postProcessAfterInitialization(java.lang.Object, java.lang.String)` callback from the configured `BeanPostProcessors`.

  This callback will only be applied to bean definitions with a bean class. In particular, it will not be applied to beans with a "factory-method".

  Post-processors may implement the extended `SmartInstantiationAwareBeanPostProcessor` interface in order to predict the type of the bean object that they are going to return here.

  Specified by:
    `postProcessBeforeInstantiation` in interface `InstantiationAwareBeanPostProcessor`
  Parameters:
    `beanClass` - the class of the bean to be instantiated
    `beanName` - the name of the bean
  Returns:
    the bean object to expose instead of a default instance of the target bean, or `null` to proceed with default instantiation
  Throws:
    `BeansException` - in case of errors
  See Also:
    `AbstractBeanDefinition.hasBeanClass()`, `AbstractBeanDefinition.getFactoryMethodName()`

### postProcessAfterInstantiation

    public boolean postProcessAfterInstantiation(Object bean,
                                                 String beanName)

  Description copied from interface: `InstantiationAwareBeanPostProcessor`
  Perform operations after the bean has been instantiated, via a constructor or factory method, but before Spring property population (from explicit properties or autowiring) occurs.

  Specified by:
    `postProcessAfterInstantiation` in interface `InstantiationAwareBeanPostProcessor`
  Parameters:
    `bean` - the bean instance created, but whose properties have not yet been set
    `beanName` - the name of the bean
  Returns:
    `true` if properties should be set on the bean; `false` if property population should be skipped. Normal implementations should return `true`. Returning `false` will also prevent any subsequent InstantiationAwareBeanPostProcessor instances being invoked on this bean instance.

### postProcessPropertyValues

    public PropertyValues postProcessPropertyValues(PropertyValues pvs,
                                                    PropertyDescriptor[] pds,
                                                    Object bean,
                                                    String beanName)

  Description copied from interface: `InstantiationAwareBeanPostProcessor`
  Post-process the given property values before the factory applies them to the given bean. Allows for checking whether all dependencies have been satisfied, for example based on a "Required" annotation on bean property setters.

  Also allows for replacing the property values to apply, typically through creating a new MutablePropertyValues instance based on the original PropertyValues, adding or removing specific values.

  Specified by:
    `postProcessPropertyValues` in interface `InstantiationAwareBeanPostProcessor`
  Parameters:
    `pvs` - the property values that the factory is about to apply (never `null`)
    `pds` - the relevant property descriptors for the target bean (with ignored dependency types - which the factory handles specifically - already filtered out)
    `bean` - the bean instance created, but whose properties have not yet been set
    `beanName` - the name of the bean
  Returns:
    the actual property values to apply to to the given bean (can be the passed-in PropertyValues instance), or `null` to skip property population
  See Also:
    `MutablePropertyValues`

### postProcessBeforeInitialization

    public Object postProcessBeforeInitialization(Object bean,
                                                  String beanName)

  Description copied from interface: `BeanPostProcessor`
  Apply this BeanPostProcessor to the given new bean instance before any bean initialization callbacks (like InitializingBean's `afterPropertiesSet` or a custom init-method). The bean will already be populated with property values. The returned bean instance may be a wrapper around the original.

  Specified by:
    `postProcessBeforeInitialization` in interface `BeanPostProcessor`
  Parameters:
    `bean` - the new bean instance
    `beanName` - the name of the bean
  Returns:
    the bean instance to use, either the original or a wrapped one
  See Also:
    `InitializingBean.afterPropertiesSet()`

### postProcessAfterInitialization

    public Object postProcessAfterInitialization(Object bean,
                                                 String beanName)
                                          throws BeansException

  Create a proxy with the configured interceptors if the bean is identified as one to proxy by the subclass.

  Specified by:
    `postProcessAfterInitialization` in interface `BeanPostProcessor`
  Parameters:
    `bean` - the new bean instance
    `beanName` - the name of the bean
  Returns:
    the bean instance to use, either the original or a wrapped one
  Throws:
    `BeansException` - in case of errors
  See Also:
    `getAdvicesAndAdvisorsForBean(java.lang.Class, java.lang.String, org.springframework.aop.TargetSource)`

### getCacheKey

    protected Object getCacheKey(Class beanClass,
                                 String beanName)

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

  Parameters:
    `beanClass` - the bean class
    `beanName` - the bean name
  Returns:
    the cache key for the given class and name

### isInfrastructureClass

    protected boolean isInfrastructureClass(Class beanClass,
                                            String beanName)

  Deprecated. in favor of `isInfrastructureClass(beanClass)`

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

  See Also:
    `isInfrastructureClass(Class)`

### isInfrastructureClass

    protected boolean isInfrastructureClass(Class beanClass)

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

  Default implementation considers Advisors, Advices and AbstractAutoProxyCreators as infrastructure classes.

  Parameters:
    `beanClass` - the class of the bean
  Returns:
    whether the bean represents an infrastructure class
  See Also:
    `Advisor`, `MethodInterceptor`, `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`.

  Parameters:
    `beanClass` - the class of the bean
    `beanName` - the name of the bean
  Returns:
    whether to skip the given bean

### getCustomTargetSource

    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.

  Parameters:
    `beanClass` - the class of the bean to create a TargetSource for
    `beanName` - the name of the bean
  Returns:
    a TargetSource for this bean
  See Also:
    `setCustomTargetSourceCreators(org.springframework.aop.framework.autoproxy.TargetSourceCreator[])`

### createProxy

    protected Object createProxy(Class beanClass,
                                 String beanName,
                                 Object[] specificInterceptors,
                                 TargetSource targetSource)

  Create an AOP proxy for the given bean.

  Parameters:
    `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
  Returns:
    the AOP proxy for the bean
  See Also:
    `buildAdvisors(java.lang.String, java.lang.Object[])`

### shouldProxyTargetClass

    protected boolean shouldProxyTargetClass(Class beanClass,
                                             String beanName)

  Determine whether the given bean should be proxied with its target class rather than its interfaces. Checks the `"proxyTargetClass" setting` as well as the `"preserveTargetClass" attribute` of the corresponding bean definition.

  Parameters:
    `beanClass` - the class of the bean
    `beanName` - the name of the bean
  Returns:
    whether the given bean should be proxied with its target class
  See Also:
    `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.

  Returns:
    whether the Advisors are pre-filtered
  See Also:
    `getAdvicesAndAdvisorsForBean(java.lang.Class, java.lang.String, org.springframework.aop.TargetSource)`, `Advised.setPreFiltered(boolean)`

### buildAdvisors

    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.

  Parameters:
    `beanName` - the name of the bean
    `specificInterceptors` - the set of interceptors that is specific to this bean (may be empty, but not null)
  Returns:
    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.

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

### getAdvicesAndAdvisorsForBean

    protected abstract Object[] getAdvicesAndAdvisorsForBean(Class beanClass,
                                                             String beanName,
                                                             TargetSource customTargetSource)
                                                      throws BeansException

  Return whether the given bean is to be proxied, what additional advices (e.g. AOP Alliance interceptors) and advisors to apply.

  Parameters:
    `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.
  Returns:
    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.
  Throws:
    `BeansException` - in case of errors
  See Also:
    `DO_NOT_PROXY`, `PROXY_WITHOUT_ADDITIONAL_INTERCEPTORS`

Overview | Package | Class | Use | Tree | Deprecated | Index | Help
| The Spring Framework
PREV CLASS NEXT CLASS | FRAMES NO FRAMES
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD

Copyright © 2002-2007 The Spring Framework.