org.springframework.beans.factory.config.BeanPostProcessor that
handles org.springframework.scripting.ScriptFactory definitions,
replacing each factory with the actual scripted Java object generated by it.
This is similar to the
org. mechanism, but is
specifically tailored for scripts and not built into Spring's core
container itself but rather implemented as an extension.
Note
The most important characteristic of this post-processor
is that constructor arguments are applied to the
org. instance
while bean property values are applied to the generated scripted object.
Typically, constructor arguments include a script source locator and
potentially script interfaces, while bean property values include
references and config values to inject into the scripted object itself.
The following ScriptFactoryPostProcessor will automatically
be applied to the two
org. definitions below.
At runtime, the actual scripted objects will be exposed for
"bshMessenger" and "groovyMessenger", rather than the
org. instances. Both of
those are supposed to be castable to the example's Messenger
interfaces here.
<bean class="org.springframework.scripting.support.ScriptFactoryPostProcessor"/> <bean id="bshMessenger" class="org.springframework.scripting.bsh.BshScriptFactory"> <constructor-arg value="classpath:mypackage/Messenger.bsh"/> <constructor-arg value="mypackage.Messenger"/> <property name="message" value="Hello World!"/> </bean> <bean id="groovyMessenger" class="org.springframework.scripting.groovy.GroovyScriptFactory"> <constructor-arg value="classpath:mypackage/Messenger.groovy"/> <property name="message" value="Hello World!"/> </bean>
Note
Please note that the above excerpt from a Spring
XML bean definition file uses just the <bean/>-style syntax
(in an effort to illustrate using the ScriptFactoryPostProcessor itself).
In reality, you would never create a <bean/> definition for a
ScriptFactoryPostProcessor explicitly; rather you would import the
tags from the 'lang' namespace and simply create scripted
beans using the tags in that namespace... as part of doing so, a
ScriptFactoryPostProcessor will implicitly be created for you.
The Spring reference documentation contains numerous examples of using
tags in the 'lang' namespace; by way of an example, find below
a Groovy-backed bean defined using the 'lang:groovy' tag.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:lang="http://www.springframework.org/schema/lang">
<!-- this is the bean definition for the Groovy-backed Messenger implementation -->
<lang:groovy id="messenger" script-source="classpath:Messenger.groovy">
<lang:property name="message" value="I Can Do The Frug" />
</lang:groovy>
<!-- an otherwise normal bean that will be injected by the Groovy-backed Messenger -->
<bean id="bookingService" class="x.y.DefaultBookingService">
<property name="messenger" ref="messenger" />
</bean>
</beans>
| Modifier and Type | Field and Description |
|---|---|
| private ClassLoader | |
| private ConfigurableBeanFactory | |
| private boolean | |
| private long | |
| public static final String | INLINE_SCRIPT_PREFIX
The |
| public static final String | LANGUAGE_ATTRIBUTE
The |
| protected final Log | logger
Logger available to subclasses. |
| public static final String | PROXY_TARGET_CLASS_ATTRIBUTE
The |
| public static final String | REFRESH_CHECK_DELAY_ATTRIBUTE
The |
| private ResourceLoader | |
| private static final String | |
| pack-priv final DefaultListableBeanFactory | |
| private static final String | |
| private final Map | scriptSourceCache
Map from bean name String to ScriptSource object. |
| Access | Constructor and Description |
|---|---|
| public |
| Modifier and Type | Method and Description |
|---|---|
| protected ScriptSource | Returns: the ScriptSource instancethe name of the scripted bean beanName, String the script source locator scriptSourceLocator, ResourceLoader the ResourceLoader to use (if necessary) resourceLoader)Convert the given script source locator to a ScriptSource instance. |
| protected Class | Returns: the merged interface as Classthe interfaces to merge interfaces)Create a composite interface Class for the given interfaces, implementing the given interfaces in one single Class. |
| protected Class | Returns: the config interfacethe bean definition (property values etc) to create a
config interface for bd, Class<?>[] the interfaces to check against (might define
getters corresponding to the setters we're supposed to generate) interfaces)Create a config interface for the given bean definition, defining setter methods for the defined property values as well as an init method and a destroy method (if defined). |
| protected Object | Returns: the generated proxythe refreshable TargetSource ts, Class<?>[] the proxy interfaces (may be interfaces, boolean proxyTargetClass)null to
indicate proxying of all interfaces implemented by the target class)Create a refreshable proxy for the given AOP TargetSource. |
| protected BeanDefinition | Returns: the extracted ScriptFactory bean definitionthe full script bean definition bd, String the name of the internal ScriptFactory bean scriptFactoryBeanName, ScriptSource the ScriptSource for the scripted bean scriptSource, Class<?>[] the interfaces that the scripted bean is supposed to implement interfaces)Create a bean definition for the scripted object, based on the given script definition, extracting the definition data that is relevant for the scripted object (that is, everything but bean class and constructor arguments). |
| protected BeanDefinition | Returns: the extracted ScriptFactory bean definitionthe full script bean definition bd)Create a ScriptFactory bean definition based on the given script definition, extracting only the definition data that is relevant for the ScriptFactory (that is, only bean class and constructor arguments). |
| public void | destroy()
Implements org. Destroy the inner bean factory (used for scripts) on shutdown. |
| public int | |
| protected ScriptSource | Returns: the corresponding ScriptSource instancethe name of the scripted bean beanName, String the script source locator associated with the bean scriptSourceLocator)Obtain a ScriptSource for the given bean, lazily creating it if not cached already. |
| public Object | postProcessBeforeInstantiation(Class<?>
the class of the bean to be instantiated beanClass, String the name of the bean beanName)Overrides default org. Apply this BeanPostProcessor before the target bean gets instantiated. |
| public PropertyValues | postProcessProperties(PropertyValues
the property values that the factory is about to apply (never pvs, Object null)the bean instance created, but whose properties have not yet been set bean, String the name of the bean beanName)Overrides default org. Post-process the given property values before the factory applies them to the given bean. |
| public Class | predictBeanType(Class<?>
the raw class of the bean beanClass, String the name of the bean beanName)Overrides default org. Predict the type of the bean to be eventually returned from this
processor's |
| protected void | prepareScriptBeans(BeanDefinition
the original bean definition in the main BeanFactory bd, String the name of the internal ScriptFactory bean scriptFactoryBeanName, String the name of the internal scripted object bean scriptedObjectBeanName)Prepare the script beans in the internal BeanFactory that this post-processor uses. |
| protected boolean | |
| protected long | Returns: the refresh check delaythe BeanDefinition to check beanDefinition)Get the refresh check delay for the given |
| public void | setBeanClassLoader(ClassLoader
the owning class loader classLoader)Implements org. Callback that supplies the bean |
| public void | setBeanFactory(BeanFactory
owning BeanFactory (never beanFactory)null).
The bean can immediately call methods on the factory.Implements org. Callback that supplies the owning factory to a bean instance. |
| public void | setDefaultProxyTargetClass(boolean
the flag value to set defaultProxyTargetClass)Flag to signal that refreshable proxies should be created to proxy the target class not its interfaces. |
| public void | setDefaultRefreshCheckDelay(long defaultRefreshCheckDelay)
Set the delay between refresh checks, in milliseconds. |
| public void | setResourceLoader(ResourceLoader
the ResourceLoader object to be used by this object resourceLoader)Implements org. Set the ResourceLoader that this object runs in. This might be a ResourcePatternResolver, which can be checked
through |
| beanClassLoader | back to summary |
|---|---|
| private ClassLoader beanClassLoader
| |
| beanFactory | back to summary |
|---|---|
| private ConfigurableBeanFactory beanFactory
| |
| defaultProxyTargetClass | back to summary |
|---|---|
| private boolean defaultProxyTargetClass | |
| defaultRefreshCheckDelay | back to summary |
|---|---|
| private long defaultRefreshCheckDelay | |
| INLINE_SCRIPT_PREFIX | back to summary |
|---|---|
| public static final String INLINE_SCRIPT_PREFIX The An inline script is a script that is defined right there in the (typically XML) configuration, as opposed to being defined in an external file. | |
| LANGUAGE_ATTRIBUTE | back to summary |
|---|---|
| public static final String LANGUAGE_ATTRIBUTE The | |
| logger | back to summary |
|---|---|
| protected final Log logger Logger available to subclasses. | |
| PROXY_TARGET_CLASS_ATTRIBUTE | back to summary |
|---|---|
| public static final String PROXY_TARGET_CLASS_ATTRIBUTE The | |
| REFRESH_CHECK_DELAY_ATTRIBUTE | back to summary |
|---|---|
| public static final String REFRESH_CHECK_DELAY_ATTRIBUTE The | |
| resourceLoader | back to summary |
|---|---|
| private ResourceLoader resourceLoader | |
| SCRIPT_FACTORY_NAME_PREFIX | back to summary |
|---|---|
| private static final String SCRIPT_FACTORY_NAME_PREFIX | |
| scriptBeanFactory | back to summary |
|---|---|
| pack-priv final DefaultListableBeanFactory scriptBeanFactory | |
| SCRIPTED_OBJECT_NAME_PREFIX | back to summary |
|---|---|
| private static final String SCRIPTED_OBJECT_NAME_PREFIX | |
| scriptSourceCache | back to summary |
|---|---|
| private final Map<String, ScriptSource> scriptSourceCache Map from bean name String to ScriptSource object. | |
| ScriptFactoryPostProcessor | back to summary |
|---|---|
| public ScriptFactoryPostProcessor() | |
| convertToScriptSource | back to summary |
|---|---|
| protected ScriptSource convertToScriptSource(String beanName, String scriptSourceLocator, ResourceLoader resourceLoader) Convert the given script source locator to a ScriptSource instance. By default, supported locators are Spring resource locations (such as "file:C:/myScript.bsh" or "classpath:myPackage/myScript.bsh") and inline scripts ("inline:myScriptText...").
| |
| createCompositeInterface | back to summary |
|---|---|
| protected Class Create a composite interface Class for the given interfaces, implementing the given interfaces in one single Class. The default implementation builds a JDK proxy class for the given interfaces.
| |
| createConfigInterface | back to summary |
|---|---|
| protected Class Create a config interface for the given bean definition, defining setter methods for the defined property values as well as an init method and a destroy method (if defined). This implementation creates the interface via CGLIB's InterfaceMaker, determining the property types from the given interfaces (as far as possible).
| |
| createRefreshableProxy | back to summary |
|---|---|
| protected Object createRefreshableProxy(TargetSource ts, Class<?>[] interfaces, boolean proxyTargetClass) Create a refreshable proxy for the given AOP TargetSource.
| |
| createScriptedObjectBeanDefinition | back to summary |
|---|---|
| protected BeanDefinition createScriptedObjectBeanDefinition(BeanDefinition bd, String scriptFactoryBeanName, ScriptSource scriptSource, Class<?>[] interfaces) Create a bean definition for the scripted object, based on the given script definition, extracting the definition data that is relevant for the scripted object (that is, everything but bean class and constructor arguments).
| |
| createScriptFactoryBeanDefinition | back to summary |
|---|---|
| protected BeanDefinition createScriptFactoryBeanDefinition(BeanDefinition bd) Create a ScriptFactory bean definition based on the given script definition, extracting only the definition data that is relevant for the ScriptFactory (that is, only bean class and constructor arguments).
| |
| destroy | back to summary |
|---|---|
| public void destroy() Implements org. Destroy the inner bean factory (used for scripts) on shutdown.
| |
| getOrder | back to summary |
|---|---|
| public int getOrder() Implements org. Doc from org. Get the order value of this object. Higher values are interpreted as lower priority. As a consequence,
the object with the lowest value has the highest priority (somewhat
analogous to Servlet Same order values will result in arbitrary sort positions for the affected objects.
| |
| getScriptSource | back to summary |
|---|---|
| protected ScriptSource getScriptSource(String beanName, String scriptSourceLocator) Obtain a ScriptSource for the given bean, lazily creating it if not cached already.
| |
| postProcessBeforeInstantiation | back to summary |
|---|---|
| public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) Overrides default org. 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
This callback will be applied to bean definitions with their bean class, as well as to factory-method definitions in which case the returned bean type will be passed in here. Post-processors may implement the extended
The default implementation returns | |
| postProcessProperties | back to summary |
|---|---|
| public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) Overrides default org. Doc from org. Post-process the given property values before the factory applies them to the given bean. The default implementation returns the given
| |
| predictBeanType | back to summary |
|---|---|
| public Class Overrides default org. Doc from org. Predict the type of the bean to be eventually returned from this
processor's The default implementation returns | |
| prepareScriptBeans | back to summary |
|---|---|
| protected void prepareScriptBeans(BeanDefinition bd, String scriptFactoryBeanName, String scriptedObjectBeanName) Prepare the script beans in the internal BeanFactory that this post-processor uses. Each original bean definition will be split into a ScriptFactory definition and a scripted object definition.
| |
| resolveProxyTargetClass | back to summary |
|---|---|
| protected boolean resolveProxyTargetClass(BeanDefinition beanDefinition) | |
| resolveRefreshCheckDelay | back to summary |
|---|---|
| protected long resolveRefreshCheckDelay(BeanDefinition beanDefinition) Get the refresh check delay for the given
| |
| setBeanClassLoader | back to summary |
|---|---|
| public void setBeanClassLoader(ClassLoader classLoader) Implements org. Doc from org. Callback that supplies the bean Invoked after the population of normal bean properties but
before an initialization callback such as
| |
| setBeanFactory | back to summary |
|---|---|
| public void setBeanFactory(BeanFactory beanFactory) Implements org. Doc from org. 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
| |
| setDefaultProxyTargetClass | back to summary |
|---|---|
| public void setDefaultProxyTargetClass(boolean defaultProxyTargetClass) Flag to signal that refreshable proxies should be created to proxy the target class not its interfaces.
| |
| setDefaultRefreshCheckDelay | back to summary |
|---|---|
| public void setDefaultRefreshCheckDelay(long defaultRefreshCheckDelay) Set the delay between refresh checks, in milliseconds. Default is -1, indicating no refresh checks at all. Note that an actual refresh will only happen when
the | |
| setResourceLoader | back to summary |
|---|---|
| public void setResourceLoader(ResourceLoader resourceLoader) Implements org. Doc from org. Set the ResourceLoader that this object runs in. This might be a ResourcePatternResolver, which can be checked
through Invoked after population of normal bean properties but before an init callback
like InitializingBean's
| |