| 
 | The Spring Framework | |||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | |||||||||
java.lang.Objectorg.springframework.aop.framework.ProxyConfig
org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator
public abstract class AbstractAutoProxyCreator
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.
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_PROXYConvenience constant for subclasses: Return value for "do not proxy". | 
| protected  Log | loggerLogger available to subclasses | 
| protected static Object[] | PROXY_WITHOUT_ADDITIONAL_INTERCEPTORSConvenience 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  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 afterPropertiesSetor 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 loaderto
 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 trueif 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 | 
|---|
protected static final Object[] DO_NOT_PROXY
protected static final Object[] PROXY_WITHOUT_ADDITIONAL_INTERCEPTORS
protected final Log logger
| Constructor Detail | 
|---|
public AbstractAutoProxyCreator()
| Method Detail | 
|---|
public final void setOrder(int order)
Default value is Integer.MAX_VALUE, meaning that it's non-ordered.
order - ordering valuepublic final int getOrder()
OrderedNormally 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.
Ordered.LOWEST_PRECEDENCEpublic void setFrozen(boolean frozen)
Overridden from the super class to prevent the proxy configuration from being frozen before the proxy is created.
setFrozen in class ProxyConfigpublic boolean isFrozen()
ProxyConfig
isFrozen in class ProxyConfigpublic void setAdvisorAdapterRegistry(AdvisorAdapterRegistry advisorAdapterRegistry)
GlobalAdvisorAdapterRegistrypublic void setCustomTargetSourceCreators(TargetSourceCreator[] targetSourceCreators)
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.
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.public void setInterceptorNames(String[] interceptorNames)
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 void setApplyCommonInterceptorsFirst(boolean applyCommonInterceptorsFirst)
public void setBeanClassLoader(ClassLoader classLoader)
BeanClassLoaderAwareclass 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.
setBeanClassLoader in interface BeanClassLoaderAwareclassLoader - the owning class loader; may be null in
 which case a default ClassLoader must be used, for example
 the ClassLoader obtained via
 ClassUtils.getDefaultClassLoader()public void setBeanFactory(BeanFactory beanFactory)
BeanFactoryAwareInvoked after the population of normal bean properties
 but before an initialization callback such as
 InitializingBean.afterPropertiesSet() or a custom init-method.
setBeanFactory in interface BeanFactoryAwarebeanFactory - owning BeanFactory (never null).
 The bean can immediately call methods on the factory.BeanInitializationExceptionprotected BeanFactory getBeanFactory()
null, as this object doesn't need to belong to a bean factory.
public Object postProcessBeforeInstantiation(Class beanClass, String beanName) throws BeansException
InstantiationAwareBeanPostProcessorIf 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.
postProcessBeforeInstantiation in interface InstantiationAwareBeanPostProcessorbeanClass - the class of the bean to be instantiatedbeanName - the name of the bean
null to proceed with default instantiation
BeansException - in case of errorsAbstractBeanDefinition.hasBeanClass(), 
AbstractBeanDefinition.getFactoryMethodName()public boolean postProcessAfterInstantiation(Object bean, String beanName)
InstantiationAwareBeanPostProcessor
postProcessAfterInstantiation in interface InstantiationAwareBeanPostProcessorbean - the bean instance created, but whose properties have not yet been setbeanName - the name of the bean
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.public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)
InstantiationAwareBeanPostProcessorAlso 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.
postProcessPropertyValues in interface InstantiationAwareBeanPostProcessorpvs - 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 setbeanName - the name of the bean
null
 to skip property populationMutablePropertyValuespublic Object postProcessBeforeInitialization(Object bean, String beanName)
BeanPostProcessorafterPropertiesSet
 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.
postProcessBeforeInitialization in interface BeanPostProcessorbean - the new bean instancebeanName - the name of the bean
InitializingBean.afterPropertiesSet()public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException
postProcessAfterInitialization in interface BeanPostProcessorbean - the new bean instancebeanName - the name of the bean
BeansException - in case of errorsgetAdvicesAndAdvisorsForBean(java.lang.Class, java.lang.String, org.springframework.aop.TargetSource)protected Object getCacheKey(Class beanClass, String beanName)
beanClass - the bean classbeanName - the bean name
protected boolean isInfrastructureClass(Class beanClass, String beanName)
isInfrastructureClass(beanClass)
isInfrastructureClass(Class)protected boolean isInfrastructureClass(Class beanClass)
Default implementation considers Advisors, Advices and AbstractAutoProxyCreators as infrastructure classes.
beanClass - the class of the bean
Advisor, 
MethodInterceptor, 
shouldSkip(java.lang.Class, java.lang.String)protected boolean shouldSkip(Class beanClass, String beanName)
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 beanbeanName - the name of the bean
protected TargetSource getCustomTargetSource(Class beanClass, String beanName)
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 forbeanName - the name of the bean
setCustomTargetSourceCreators(org.springframework.aop.framework.autoproxy.TargetSourceCreator[])protected Object createProxy(Class beanClass, String beanName, Object[] specificInterceptors, TargetSource targetSource)
beanClass - the class of the beanbeanName - the name of the beanspecificInterceptors - 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
buildAdvisors(java.lang.String, java.lang.Object[])protected boolean shouldProxyTargetClass(Class beanClass, String beanName)
"proxyTargetClass" setting as well as the
 "preserveTargetClass" attribute
 of the corresponding bean definition.
beanClass - the class of the beanbeanName - the name of the bean
AutoProxyUtils.shouldProxyTargetClass(org.springframework.beans.factory.config.ConfigurableListableBeanFactory, java.lang.String)protected Advisor[] buildAdvisors(String beanName, Object[] specificInterceptors)
beanName - the name of the beanspecificInterceptors - the set of interceptors that is
 specific to this bean (may be empty, but not null)
protected void customizeProxyFactory(ProxyFactory proxyFactory)
The default implementation is empty.
proxyFactory - ProxyFactory that is already configured with
 TargetSource and interfaces and will be used to create the proxy
 immediably after this method returnsprotected abstract Object[] getAdvicesAndAdvisorsForBean(Class beanClass, String beanName, TargetSource customTargetSource) throws BeansException
beanClass - the class of the bean to advisebeanName - the name of the beancustomTargetSource - 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.
null if no proxy at all, not even with the common interceptors.
 See constants DO_NOT_PROXY and PROXY_WITHOUT_ADDITIONAL_INTERCEPTORS.
BeansException - in case of errorsDO_NOT_PROXY, 
PROXY_WITHOUT_ADDITIONAL_INTERCEPTORS| 
 | The Spring Framework | |||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | |||||||||