Save This Page
Home » Spring-Framework-090522 » org.springframework » aop » framework » autoproxy » [javadoc | source]
abstract public class: AbstractAutoProxyCreator [javadoc | source]

All Implemented Interfaces:
    Ordered, BeanClassLoaderAware, AopInfrastructureBean, SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware, Serializable

Direct Known Subclasses:
    AspectJAwareAdvisorAutoProxyCreator, AbstractAdvisorAutoProxyCreator, AnnotationAwareAspectJAutoProxyCreator, InfrastructureAdvisorAutoProxyCreator, BeanNameAutoProxyCreator, DefaultAdvisorAutoProxyCreator

org.springframework.beans.factory.config.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 org.springframework.aop.TargetSource . If there are no TargetSourceCreators set, or if none matches, a will be used by default to wrap the target bean instance.

Field Summary
protected static final  Object[] DO_NOT_PROXY    Convenience constant for subclasses: Return value for "do not proxy". 
protected static final  Object[] PROXY_WITHOUT_ADDITIONAL_INTERCEPTORS    Convenience constant for subclasses: Return value for "proxy without additional interceptors, just the common ones". 
protected final  Log logger    Logger available to subclasses 
Fields inherited from org.springframework.aop.framework.ProxyConfig:
opaque,  exposeProxy
Method from org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator Summary:
advisorsPreFiltered,   buildAdvisors,   createProxy,   customizeProxyFactory,   determineCandidateConstructors,   getAdvicesAndAdvisorsForBean,   getBeanFactory,   getCacheKey,   getCustomTargetSource,   getEarlyBeanReference,   getOrder,   isFrozen,   isInfrastructureClass,   isInfrastructureClass,   postProcessAfterInitialization,   postProcessAfterInstantiation,   postProcessBeforeInitialization,   postProcessBeforeInstantiation,   postProcessPropertyValues,   predictBeanType,   setAdvisorAdapterRegistry,   setApplyCommonInterceptorsFirst,   setBeanClassLoader,   setBeanFactory,   setCustomTargetSourceCreators,   setFrozen,   setInterceptorNames,   setOrder,   setProxyClassLoader,   shouldProxyTargetClass,   shouldSkip,   wrapIfNecessary
Methods from org.springframework.aop.framework.ProxyConfig:
copyFrom,   isExposeProxy,   isFrozen,   isOpaque,   isOptimize,   isProxyTargetClass,   setExposeProxy,   setFrozen,   setOpaque,   setOptimize,   setProxyTargetClass,   toString
Methods from java.lang.Object:
clone,   equals,   finalize,   getClass,   hashCode,   notify,   notifyAll,   toString,   wait,   wait,   wait
Method from org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator Detail:
 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.

 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.

    The default implementation is empty.

 public Constructor[] determineCandidateConstructors(Class beanClass,
    String beanName) throws BeansException 
 abstract protected 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.
 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. 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.

 public Object getEarlyBeanReference(Object bean,
    String beanName) throws BeansException 
 public final int getOrder() 
 public boolean isFrozen() 
 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.

 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.
 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.
 public boolean postProcessAfterInstantiation(Object bean,
    String beanName) 
 public Object postProcessBeforeInitialization(Object bean,
    String beanName) 
 public Object postProcessBeforeInstantiation(Class beanClass,
    String beanName) throws BeansException 
 public PropertyValues postProcessPropertyValues(PropertyValues pvs,
    PropertyDescriptor[] pds,
    Object bean,
    String beanName) 
 public Class predictBeanType(Class beanClass,
    String beanName) 
 public  void setAdvisorAdapterRegistry(AdvisorAdapterRegistry advisorAdapterRegistry) 
    Specify the AdvisorAdapterRegistry to use. Default is the global AdvisorAdapterRegistry.
 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.
 public  void setBeanClassLoader(ClassLoader classLoader) 
 public  void setBeanFactory(BeanFactory beanFactory) 
 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.

 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.

 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.

 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.

 public  void setProxyClassLoader(ClassLoader classLoader) 
    Set the ClassLoader to generate the proxy class in.

    Default is the bean ClassLoader, i.e. the ClassLoader used by the containing BeanFactory for loading all bean classes. This can be overridden here for specific proxies.

 protected boolean shouldProxyTargetClass(Class beanClass,
    String beanName) 
 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.

 protected Object wrapIfNecessary(Object bean,
    String beanName,
    Object cacheKey) 
    Wrap the given bean if necessary, i.e. if it is eligible for being proxied.