org.springframework.aop.framework
Class ProxyFactoryBean

java.lang.Object
  extended by org.springframework.aop.framework.ProxyConfig
      extended by org.springframework.aop.framework.AdvisedSupport
          extended by org.springframework.aop.framework.ProxyFactoryBean
All Implemented Interfaces:
Serializable, Advised, AdvisedSupportListener, BeanFactoryAware, FactoryBean

public class ProxyFactoryBean
extends AdvisedSupport
implements FactoryBean, BeanFactoryAware, AdvisedSupportListener

FactoryBean implementation for use to source AOP proxies from a Spring BeanFactory.

Interceptors and Advisors are identified by a list of bean names in the current bean factory. These beans should be of type Interceptor or Advisor. The last entry in the list can be the name of any bean in the factory. If it's neither an Interceptor nor an Advisor, a new SingletonTargetSource is added to wrap it. If it is a TargetSource, it is used as this proxy factory's TargetSource. It is normally preferred to use the "targetSource" property to set the TargetSource. It is not possible to use both the targetSource property and an interceptor name: this is treated as a configuration error.

Global interceptors and advisors can be added at the factory level. The specified ones are expanded in an interceptor list where an "xxx*" entry is included in the list, matching the given prefix with the bean names (e.g. "global*" would match both "globalBean1" and "globalBean2", "*" all defined interceptors). The matching interceptors get applied according to their returned order value, if they implement the Ordered interface. An interceptor name list may not conclude with a global "xxx*" pattern, as global interceptors cannot invoke targets.

Creates a J2SE proxy when proxy interfaces are given, a CGLIB proxy for the actual target class if not. Note that the latter will only work if the target class does not have final methods, as a dynamic subclass will be created at runtime.

It's possible to cast a proxy obtained from this factory to Advised, or to obtain the ProxyFactoryBean reference and programmatically manipulate it. This won't work for existing prototype references, which are independent. However, it will work for prototypes subsequently obtained from the factory. Changes to interception will work immediately on singletons (including existing references). However, to change interfaces or target it's necessary to obtain a new instance from the factory. This means that singleton instances obtained from the factory do not have the same object identity. However, they do have the same interceptors and target, and changing any reference will change all objects.

Author:
Rod Johnson, Juergen Hoeller
See Also:
setInterceptorNames(java.lang.String[]), setProxyInterfaces(java.lang.String[]), MethodInterceptor, Advised, SingletonTargetSource, Serialized Form

Field Summary
static String GLOBAL_SUFFIX
          This suffix in a value in an interceptor list indicates to expand globals.
 
Fields inherited from class org.springframework.aop.framework.AdvisedSupport
advisorChainFactory, EMPTY_TARGET_SOURCE, targetSource
 
Fields inherited from class org.springframework.aop.framework.ProxyConfig
exposeProxy, logger
 
Constructor Summary
ProxyFactoryBean()
           
 
Method Summary
 void activated(AdvisedSupport advisedSupport)
          Invoked when the first proxy is created.
 void adviceChanged(AdvisedSupport advisedSupport)
          Blow away and recache singleton on an advice change.
 Object getObject()
          Return a proxy.
 Class getObjectType()
          Return the type of the proxy.
protected  Object getProxy(AopProxy aopProxy)
          Return the proxy object to expose.
 boolean isSingleton()
          Is the bean managed by this factory a singleton or a prototype?
 void setAdvisorAdapterRegistry(AdvisorAdapterRegistry advisorAdapterRegistry)
          Specify the AdvisorAdapterRegistry to use.
 void setAutodetectInterfaces(boolean autodetectInterfaces)
          Set whether to autodetect proxy interfaces if none specified.
 void setBeanFactory(BeanFactory beanFactory)
          Callback that supplies the owning factory to a bean instance.
 void setFrozen(boolean frozen)
          Set whether this config should be frozen.
 void setInterceptorNames(String[] interceptorNames)
          Set the list of Advice/Advisor bean names.
 void setProxyInterfaces(String[] interfaceNames)
          Set the names of the interfaces we're proxying.
 void setSingleton(boolean singleton)
          Set the value of the singleton property.
 void setTargetName(String targetName)
          Set the name of the target bean.
 
Methods inherited from class org.springframework.aop.framework.AdvisedSupport
addAdvice, addAdvice, addAdvisor, addAdvisor, addAdvisor, addInterface, addListener, adviceIncluded, copyConfigurationFrom, copyConfigurationFrom, countAdvicesOfType, createAopProxy, getAdvisorChainFactory, getAdvisors, getProxiedInterfaces, getTargetSource, indexOf, indexOf, isActive, isInterfaceProxied, readResolve, removeAdvice, removeAdvisor, removeAdvisor, removeInterface, removeListener, replaceAdvisor, setAdvisorChainFactory, setInterfaces, setTarget, setTargetSource, toProxyConfigString, toString, writeReplace
 
Methods inherited from class org.springframework.aop.framework.ProxyConfig
copyFrom, getAopProxyFactory, isExposeProxy, isFrozen, isOpaque, isOptimize, isProxyTargetClass, setAopProxyFactory, setExposeProxy, setOpaque, setOptimize, setProxyTargetClass
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 
Methods inherited from interface org.springframework.aop.framework.Advised
isExposeProxy, isFrozen, isProxyTargetClass, setExposeProxy
 

Field Detail

GLOBAL_SUFFIX

public static final String GLOBAL_SUFFIX
This suffix in a value in an interceptor list indicates to expand globals.

See Also:
Constant Field Values
Constructor Detail

ProxyFactoryBean

public ProxyFactoryBean()
Method Detail

setProxyInterfaces

public void setProxyInterfaces(String[] interfaceNames)
                        throws ClassNotFoundException
Set the names of the interfaces we're proxying. If no interface is given, a CGLIB for the actual class will be created.

Alternatively, use the "interfaces" property of type Class array (the bean factory will automatically convert from String to Class there).

Throws:
ClassNotFoundException
See Also:
AdvisedSupport.setInterfaces(java.lang.Class[])

setInterceptorNames

public void setInterceptorNames(String[] interceptorNames)
Set the list of Advice/Advisor bean names. This must always be set to use this factory bean in a bean factory.

The referenced beans should be of type Interceptor, Advisor or Advice The last entry in the list can be the name of any bean in the factory. If it's neither an Advice nor an Advisor, a new SingletonTargetSource is added to wrap it. Such a target bean cannot be used if the "target" or "targetSource" or "targetName" property is set, in which case the "interceptorNames" array must contain only Advice/Advisor bean names.

See Also:
MethodInterceptor, Advisor, Advice, SingletonTargetSource

setTargetName

public void setTargetName(String targetName)
Set the name of the target bean. This is an alternative to specifying the target name at the end of the "interceptorNames" array.

You can also specify a target object or a TargetSource object directly, via the "target"/"targetSource" property, respectively.

See Also:
setInterceptorNames(String[]), AdvisedSupport.setTarget(Object), AdvisedSupport.setTargetSource(org.springframework.aop.TargetSource)

setAutodetectInterfaces

public void setAutodetectInterfaces(boolean autodetectInterfaces)
Set whether to autodetect proxy interfaces if none specified. Will only kick in if "proxyTargetClass" is off (which is the default).

Default is "false": If no proxy interfaces specified, a CGLIB proxy for the full target class will be created. Specify "true" to autodetect all interfaces implemented by the target class in this case.


setSingleton

public void setSingleton(boolean singleton)
Set the value of the singleton property. Governs whether this factory should always return the same proxy instance (which implies the same target) or whether it should return a new prototype instance, which implies that the target and interceptors may be new instances also, if they are obtained from prototype bean definitions. This allows for fine control of independence/uniqueness in the object graph.


setAdvisorAdapterRegistry

public void setAdvisorAdapterRegistry(AdvisorAdapterRegistry advisorAdapterRegistry)
Specify the AdvisorAdapterRegistry to use. Default is the global AdvisorAdapterRegistry.

See Also:
GlobalAdvisorAdapterRegistry

setFrozen

public void setFrozen(boolean frozen)
Description copied from class: ProxyConfig
Set whether this config should be frozen.

When a config is frozen, no advice changes can be made. This is useful for optimization, and useful when we don't want callers to be able to manipulate configuration after casting to Advised.

Overrides:
setFrozen in class ProxyConfig

setBeanFactory

public void setBeanFactory(BeanFactory beanFactory)
                    throws BeansException
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.
Throws:
BeansException - in case of initialization errors
See Also:
BeanInitializationException

getObject

public Object getObject()
                 throws BeansException
Return a proxy. Invoked when clients obtain beans from this factory bean. Create an instance of the AOP proxy to be returned by this factory. The instance will be cached for a singleton, and create on each call to getObject() for a proxy.

Specified by:
getObject in interface FactoryBean
Returns:
a fresh AOP proxy reflecting the current state of this factory
Throws:
BeansException
See Also:
FactoryBeanNotInitializedException

getObjectType

public Class getObjectType()
Return the type of the proxy. Will check the singleton instance if already created, falling back to the TargetSource's target class.

Specified by:
getObjectType in interface FactoryBean
Returns:
the type of object that this FactoryBean creates, or null if not known at the time of the call
See Also:
TargetSource.getTargetClass()

isSingleton

public boolean isSingleton()
Description copied from interface: FactoryBean
Is the bean managed by this factory a singleton or a prototype? That is, will getObject() always return the same object (a reference that can be cached)?

NOTE: If a FactoryBean indicates to hold a singleton object, the object returned from getObject() might get cached by the owning BeanFactory. Hence, do not return true unless the FactoryBean always exposes the same reference.

The singleton status of the FactoryBean itself will generally be provided by the owning BeanFactory; usually, it has to be defined as singleton there.

Specified by:
isSingleton in interface FactoryBean
Returns:
if this bean is a singleton
See Also:
FactoryBean.getObject()

getProxy

protected Object getProxy(AopProxy aopProxy)
Return the proxy object to expose.

The default implementation uses a getProxy() call. Can be overridden to specify a custom class loader.

Parameters:
aopProxy - the prepared AopProxy instance to get the proxy from
Returns:
the proxy object to expose
See Also:
AopProxy.getProxy(), AopProxy.getProxy(ClassLoader)

activated

public void activated(AdvisedSupport advisedSupport)
Description copied from interface: AdvisedSupportListener
Invoked when the first proxy is created.

Specified by:
activated in interface AdvisedSupportListener
Parameters:
advisedSupport - the AdvisedSupport object
See Also:
AdvisedSupportListener.activated(org.springframework.aop.framework.AdvisedSupport)

adviceChanged

public void adviceChanged(AdvisedSupport advisedSupport)
Blow away and recache singleton on an advice change.

Specified by:
adviceChanged in interface AdvisedSupportListener
Parameters:
advisedSupport - the AdvisedSupport object
See Also:
AdvisedSupportListener.adviceChanged(org.springframework.aop.framework.AdvisedSupport)


Copyright (c) 2002-2007 The Spring Framework Project.